You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何对象引用为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:23:52