解引用指向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
相关产品推荐
相关产品推荐

