为什么我可以更改const T&的成员争论

时间:2014-05-12 11:42:34

标签: c++ reference const

如果函数采用const &参数,则它应该是不可变的。 为什么我可以更改传递为class的{​​{1}}中的值? 如何阻止使用const更改值的函数? 注意:编译vs2012 ad g ++ 4.8.2

const &

非常感谢提前

3 个答案:

答案 0 :(得分:2)

您可以修改引用,原因与pFoo修改指向对象的原因相同。由于您没有修改对象成员,而是另一个引用的对象。

b.rFoo = *f; // Foo's assignment operator invoked

这就是为什么你不应该公开成员变量。由于您不能强制执行预防来修改引用的对象,而不是在您自己的成员函数中。

答案 1 :(得分:1)

b.rFoo = *f

不会改变rFoo本身,它相当于

b.rFoo.operator=(*f);

将* f复制到rFoo引用的对象。

答案 2 :(得分:0)

对象的const限定符表示该对象的抽象状态不会发生变化(即,从客户端的角度来看)。这与说对象的原始位不会改变不完全相同。

C ++编译器被禁止将对象视为原始位,除非它们可以解决别名问题。在你的情况下,编译器不能。这是因为Foo* pFoo是指向对象的指针,因此该对象的状态是可修改的。也就是说,即使pFoo指向的对象发生更改,包含pFoo的对象(即b)也不会发生变化,因为pFoo继续指向同一个对象。