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

解引用指向const的指针为何得到const对象而非实际非const对象?

为什么指向非const对象的const指针解引用后是const对象?

先看你给出的代码:

int main(){ 
    object a; 
    const object* b = &a; 
    (*b); 
}

这个问题的核心其实是C++类型系统里的「访问视图」逻辑——指针的类型决定了你通过它能对目标对象做什么,而不是对象本身的实际属性。

我给你打个比方:你有一本可以随便写写画画的笔记本(就是代码里的非const对象a),然后你拿了一个带“只读锁”的放大镜(就是const object* b)。透过这个放大镜看笔记本,你只能读上面的内容,不能修改;但如果你直接拿过笔记本(直接操作a),还是可以随便改。

具体到C++的规则里:

  • const object* b的含义是:这个指针只能以const的方式访问它指向的对象。这是编译器在编译阶段给你加上的访问限制,不是把对象a真的变成了const。
  • 当你解引用b得到*b时,它的类型是const object&(const对象的引用),所以你通过它只能调用object的const成员函数,不能修改任何非const的成员变量——哪怕对象本身是非const的。
  • 反过来想,如果允许通过const object*修改对象,那这个const限定就毫无意义了,C++设计这个类型就是为了保证代码的契约:一旦你声明某个指针是指向const的,就承诺不会通过它修改对象,编译器帮你强制执行这个承诺。

举个实际的例子,如果object的定义是这样:

class object {
public:
    void change() { /* 可以修改成员的非const函数 */ }
    void look() const { /* 只读的const函数 */ }
};

那么b->change()会直接编译报错,但a.change()完全没问题,b->look()则可以正常调用——这就是指针类型带来的访问约束。

内容的提问来源于stack exchange,提问作者Ashim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:17:37