C++中通过const限定对象调用非const成员函数为何报错?
问题原因解析
你混淆了mutable关键字的作用范围和成员函数const限定的规则,二者是独立的两套约束:
mutable修饰的是类成员变量,作用仅仅是:允许在const限定的成员函数内部,或者通过const类型的对象/指针/引用,修改该成员变量的值。你之前给a1.x、a1.y赋值成功,恰好就是mutable在正常发挥作用,和display函数的调用权限没有关系。- C++中调用成员函数时,会把调用对象的地址作为隐式的
this参数传入函数:- 没有加
const限定的普通成员函数,要求传入的this是非const类型的指针,也就是说只能通过非const的对象调用 - 只有被标记为
const的成员函数,才允许传入const类型的this指针,支持通过const对象调用
- 没有加
你的display函数没有加const限定,哪怕它内部只访问了mutable的成员,也不满足const对象的调用要求,所以编译器会抛出对应错误。
修复方案
你只需要给display函数加上const后缀即可,修改后的代码如下:
// 其他部分保持不变,只修改display函数的声明 void display() const { std::cout << x << "," << y << "\n"; }
加上const之后,该函数就允许被const对象调用,同时因为你访问的x和y都是mutable修饰的,哪怕你在这个const函数里修改x、y也不会报错。
内容的提问来源于stack exchange,提问作者Abhishek Mane
相关产品推荐
相关产品推荐

