const成员函数禁止修改非静态数据成员,仅允许通过mutable修饰的成员变量进行修改;其this指针为const类型,const对象只能调用const成员函数。

const成员函数禁止修改非静态数据成员
它限制的是函数体内对this所指对象的**直接或间接写操作**:普通非mutable成员变量不能赋值、不能调用非常量成员函数(因为那可能间接修改状态)、不能通过指针/引用修改自身成员。编译器会在编译期检查,一旦出现违规就报错,比如value = 42;或setValue(10);在getValue() const里都会触发错误。
const成员函数影响this指针的类型
在void foo() const中,隐式this指针类型是const MyClass* const,而非普通成员函数里的MyClass* const。这意味着:
– 你无法把this转成非const指针再修改成员
– 即使把this存为局部MyClass*变量,赋值也会失败
– 所有通过this访问的成员都带const限定,触发同样的只读约束
const对象只能调用const成员函数
这是最常踩坑的点。声明为const MyClass obj;后:
– obj.getValue()合法(getValue带const)
– obj.setValue(5)非法(即使setValue实际没改任何东西,只要没标const就不行)
– const MyClass& ref = getObj(); ref.doWork();同样受限,ref的类型决定了可用函数集
– 构造函数和析构函数不受此限,它们本来就不属于“对象状态访问”范畴
mutable是唯一合法的例外出口
当你需要在逻辑上“只读”的函数里做缓存、计数、日志等副作用时,mutable是设计给你的逃生舱口:
– 必须显式声明为mutable int cache_;才能在const函数中修改
– 它不改变对象的逻辑常量性(比如hash()可缓存结果但不改变语义)
– 误用mutable会破坏const正确性,比如把业务关键状态标为mutable就等于绕过编译器保护
– 不支持mutable static成员,也不影响const对象的生命周期安全
立即学习“C++免费学习笔记(深入)”;


















