为什么当对象引用不变时,允许更改作为指向另一个类的指针的成员变量?

时间:2018-03-28 03:10:27

标签: c++ pointers reference operator-overloading constants

我正在阅读Scott Meyers撰写的Effective C ++,并在第11项中描述了自我编写的陷阱使用了以下代码

class Bitmap { ... };
class Widget {
...
private:
Bitmap *pb; // ptr to a heap-allocated object
};

Widget&
Widget::operator=(const Widget& rhs) // unsafe impl. of operator=
{
delete pb; // stop using current bitmap
pb = new Bitmap(*rhs.pb); // start using a copy of rhs’s bitmap
return *this; // see Item 10
}

因此,当调用者的Bitmap指针和重载参数引用(rhs)都指向相同的内存位置时,rhs会更新,即使它是方法中的const引用。为什么编译器允许它?

1 个答案:

答案 0 :(得分:3)

  

两者都指向相同的内存位置rhs得到更新,即使它是方法中的const引用。

只能保证您不能通过参数rhs修改对象。编译器无法阻止您通过其他路由进行修改。 e.g。

int a = 0;
const int& ra = a; // a can't be changed via ra
a = 42;            // but the original object is still modifiable