为何对象引用为const时,指向其他类的成员指针仍可修改?
为什么const引用的对象不会阻止修改当前对象的成员指针?
你可能在这里混淆了被const限定的对象和当前操作的对象,咱们一步步理清楚:
1. 先明确代码里修改的是谁的pb?
看这段operator=实现:
Widget& Widget::operator=(const Widget& rhs) { delete pb; // 这里的pb是当前对象(*this)的成员 pb = new Bitmap(*rhs.pb); // 还是当前对象的pb return *this; }
这里的pb是属于*this的——也就是调用operator=的那个Widget对象,而不是rhs指向的对象!rhs是const引用,只限制了你不能通过rhs去修改它指向的Widget的成员,但完全不影响你修改当前对象的成员。
2. const引用到底限制了什么?
当rhs是const Widget&时,编译器会强制:
- 你不能修改
rhs本身的成员变量(比如写rhs.pb = new Bitmap(...)会直接报错) - 你不能调用
rhs的非const成员函数(因为非const成员函数可能修改对象状态) - 你可以安全读取
rhs的成员(比如*rhs.pb就是读取rhs的pb指向的Bitmap对象,用来复制)
3. 那当前对象为什么能被修改?
因为operator=这个成员函数不是const成员函数(函数签名末尾没有const关键字),这意味着调用这个函数的对象(*this)被视为非const的,所以你完全有权修改它的所有成员,包括pb指针的指向。
补充:原代码的unsafe点和const无关
你提到这是《Effective C++》里的自赋值陷阱示例,它的不安全之处在于如果rhs和*this是同一个对象(比如执行w = w;这种自赋值操作),那么delete pb会把rhs.pb也销毁(因为它们是同一个指针),接下来new Bitmap(*rhs.pb)就会访问已经被释放的内存,导致未定义行为。但这个问题和rhs是const引用没有关系,只是自赋值场景下的逻辑错误。
内容的提问来源于stack exchange,提问作者Farsan Rashid
相关产品推荐
相关产品推荐

