一旦对象声明为const c ++,什么是受保护的

时间:2012-02-11 17:57:17

标签: c++ operator-overloading const

如果我有以下内容:

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',但我有点困惑。

arr2中的const声明究竟保护了什么?

显然不是对象的内容?

请帮助我理解。

谢谢你!

1 个答案:

答案 0 :(得分:4)

C ++编译器只强制const将保护此对象的成员,而不是间接引用的其他对象(例如通过指针)。 _buf是一个指针成员,它指向的内容不受编译器的保护。

但是,许多类基于const覆盖,以便也保护对相关对象的访问。要做到这一点,你要写:

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

这会将对象上的const传播到下标元素上的const