const成员函数用于承诺不修改对象状态,必须声明在参数列表后、函数体前,禁止修改非mutable成员或调用非常量函数,但可读取成员和修改mutable成员。

加 const 是为了告诉编译器“这个函数不修改对象状态”,否则编译器会拒绝你用 const 对象调用它。
const 成员函数的写法和位置
必须把 const 写在函数声明/定义的参数列表之后、函数体之前,不能放在返回类型前,也不能漏掉括号后的空格(虽然编译器通常容忍空格,但风格上要紧贴右括号)。
-
int getValue() const✅ 正确 -
int getValue const()❌ 语法错误 -
const int getValue()❌ 这是“返回 const int”,不是 const 成员函数 -
int getValue() const &✅ C++11 起可叠加引用限定符,但const仍得在括号后
const 成员函数里不能改哪些东西
编译器会禁止修改 this 指向的对象的任何非 mutable 成员,包括调用非常量成员函数——哪怕那个函数实际没改状态,只要没标 const,就不让调。
- 不能赋值给普通成员变量:
data = 42;→ 编译错误 - 不能调用非常量成员函数:
updateCache();→ 即使updateCache实际只读,也报错 - 可以读任何成员:
return cacheSize;✅ - 可以修改
mutable成员:mutable int callCount;→++callCount;✅
为什么 const 对象只能调用 const 成员函数
这是编译期契约:const 对象承诺“不可变”,而非常量成员函数默认有修改权限。C++ 不做运行时检查,所以必须靠语法强制隔离。
立即学习“C++免费学习笔记(深入)”;
- 场景:传
const MyClass& obj到函数里,想读obj.getValue()→ 必须getValue是const - 常见错误现象:
error: passing 'const MyClass' as 'this' argument discards qualifiers - 别指望编译器“猜”你没改——哪怕函数体是空的,没
const就不认 - 重载时,
const和非const版本可共存,编译器按调用对象是否const自动选:
int& operator[](size_t i) { return data[i]; }
const int& operator[](size_t i) const { return data[i]; }
容易被忽略的细节
const 成员函数不影响返回值类型是否可修改,只约束函数体内对 *this 的操作;另外,指针成员本身不可改,但它指向的内容是否可改,取决于指针类型(比如 int* const p 和 const int* p 完全不同)。
-
const std::string& getName() const→ 返回的引用是 const,且函数自身也是 const -
std::string& getName() const→ 合法,但调用者拿到非 const 引用后可以改字符串内容,这不违反 const 成员函数约定(因为改的是别的对象) - 如果成员是指针:
int* ptr;,在 const 成员函数里不能改ptr(比如ptr = nullptr;),但能改*ptr(比如*ptr = 1;)——除非它是const int* ptr;










