Что защищено, когда объект объявлен как const c ++ - PullRequest
1 голос
/ 11 февраля 2012

Если у меня есть следующее:

class Array{
public:
Array (int n=2) : _n(n), buf(new int[n]) {}

int & operator[](int i) const
{
return _buf[i];
}

int _n;
int* _buf;
};



int main()
{
Array arr1;
const Array arr2;

arr1[0]=1;
arr1[1]=2;

arr2[0]=arr1[0];
++arr2[0];

std:: << arr2[0]<<std::endl;
}

, программа скомпилируется и выведет '2', но я немного сбит с толку.

что именно защищает объявление const в arr2?

явно не содержание объекта?

, пожалуйста, помогите мне понять.

спасибо!

1 Ответ

4 голосов
/ 11 февраля 2012

Компилятор C ++ только обеспечивает, что const будет защищать члены этого объекта, а не другие объекты, на которые ссылаются косвенно (например, через указатель)._buf является элементом указателя, и то, на что он указывает, не защищено компилятором.

Однако многие классы переопределяют на основе const, чтобы также защитить доступ к связанным объектам.Чтобы сделать это, вы должны написать:

int & operator[](int i) { return _buf[i]; }
const int & operator[](int i) const { return _buf[i]; }

Это распространит const на объекте до const на подписанном элементе.

...