const与非const成员函数可合法重载,依据this的cv限定符选择;operator[]等访问器须成对提供,返回类型需匹配const性;mutable允许在const函数中修改特定成员;声明与定义的const位置必须严格一致。

const 和非 const 成员函数可以构成重载
能,而且这是 C++ 明确支持的合法重载形式。关键不是“能不能”,而是编译器如何根据调用对象的 const 性质选择函数——它看的是隐式 this 的类型,而不是函数内部做了什么。
常见错误现象:error: no match for 'operator[]' (operand types are 'const String' and 'int'),本质就是只提供了非 const 版本的 operator[],而 const 对象无法绑定到非 const 的 this。
- 重载依据是
this参数的 cv-qualifier(即 const 与否),不是返回值或参数列表差异 - 两个版本必须声明在同一个作用域(即同个类内),否则属于隐藏而非重载
- 函数名、参数列表完全一致,仅靠
const修饰符区分,是标准允许的特例
operator[] 这类访问器必须成对提供
只写一个非 const 版本的 operator[],会导致 const 对象无法使用下标访问;但若只写 const 版本,又会让非常量对象失去写入能力。必须两者都定义,并且返回类型也要匹配 const 性。
典型错误:把 const 版本的返回类型写成 char&,结果 const String s; s[0] = 'x'; 居然能编译通过——这破坏了 const 正确性。
- 非 const 版本返回可写引用:
char& operator[](size_t i) - const 版本返回只读引用:
const char& operator[](size_t i) const - 漏掉任一版本,或返回类型不加
const,都会导致静默错误或编译失败
mutable 是绕过 const 限制的唯一合法出口
const 成员函数里不能改任何非静态成员变量,但如果你需要缓存计算结果、统计调用次数等不影响逻辑状态的操作,mutable 就是为此设计的。
常见错误现象:error: assignment of member 'X::cache_hits_' in read-only object,说明你忘了给那个变量加 mutable。
-
mutable只能用于非静态、非常量数据成员 - 它不改变对象的逻辑 const 性,只是告诉编译器“这个变量允许在 const 函数里变”
- 滥用
mutable会破坏 const 接口契约,比如把本该反映状态的字段标为 mutable
声明和定义的 const 位置必须严格一致
const 是函数类型签名的一部分,必须紧挨着参数列表之后、函数体之前。放错位置不仅语义不同,还可能直接导致链接失败。
常见错误现象:undefined reference to 'X::get() const',往往是因为头文件里声明了 int get() const;,而实现文件里写了 int X::get() { ... }(漏了 const)。
- 正确:
int size() const;和int X::size() const { return data_.size(); } - 错误:
const int size();(这只是返回 const int,不是 const 成员函数) - 错误:
int size() const &;(多了一个&,变成左值引用限定符,和 const 限定符共存需显式写出顺序)
最容易被忽略的是:const 重载不是“多写一个函数就完事”,它要求返回类型、mutable 使用、调用链上的所有函数都保持 const 一致性。一个非 const 的 helper 被 const 函数调用,哪怕只调一次,整个函数就非法。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











