如果函数采用const &
参数,则它应该是不可变的。
为什么我可以更改传递为class
的{{1}}中的值?
如何阻止使用const
更改值的函数?
注意:编译vs2012 ad g ++ 4.8.2
const &
非常感谢提前
答案 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
继续指向同一个对象。