仅限于类当中的成员函数
这种重载仅适用于成员函数(全局函数无法基于 const 重载),因为 const 成员函数的本质是「承诺不修改当前对象(this 指针为 const T*)」
调用者的 const 属性决定匹配版本
1、非 const 对象
2、const 对象
3、const 引用或指针 引用或者指向非const对象
4、const 引用或指针 引用或者指向const对象
5、非const 引用或指针 引用或者指向const对象(无法引用或者指向)
特殊、只有 const 版本时,非 const 对象也能调用
cpp
#include <iostream>
using namespace std;
class MyClass {
public:
// 非 const 版本的成员函数
void show() {
cout << "调用非 const 版本的 show()\n";
}
// const 版本的成员函数(重载)
void show() const {
cout << "调用 const 版本的 show()\n";
}
// 带返回值的示例(更贴近实际场景)
int getValue() {
cout << "非 const 版本 getValue():可修改对象\n";
return value++; // 非 const 版本可以修改成员变量
}
int getValue() const {
cout << "const 版本 getValue():只读,不可修改对象\n";
return value; // const 版本只能读取,不能修改
}
private:
int value = 0;
};
int main() {
// 1、非 const 对象
MyClass obj;
obj.show(); // 调用非 const 版本
obj.getValue(); // 调用非 const 版本
//2、const 对象
const MyClass const_obj;
const_obj.show(); // 只能调用 const 版本
const_obj.getValue();// 只能调用 const 版本
//3、const 引用或指针 引用或者指向非const对象
// 3.1、const 引用引用非const对象
const MyClass& ref = obj;
ref.show(); // 调用 const 版本(引用是 const)
ref.getValue(); // 调用 const 版本
// 3.2、const 指针指向非const对象
const MyClass* ptr = &obj;
ptr->show(); // 调用 const 版本(指针是 const)
ptr->getValue(); // 调用 const 版本
//4、const 引用或指针 引用或者指向const对象
// 4.1、const 引用引用const对象
const MyClass& ref = const_obj;
ref.show(); // 调用 const 版本(引用是 const)
ref.getValue(); // 调用 const 版本
// 4.2、const 指针指向const对象
const MyClass* ptr = &const_obj;
ptr->show(); // 调用 const 版本(指针是 const)
ptr->getValue(); // 调用 const 版本
//5、非const 引用或指针 引用或者指向const对象(无法引用或者指向)
//会报错
// 特殊:只有 const 版本时,非 const 对象也能调用
// (注释掉非 const 的 show() 后,obj.show() 会调用 const 版本)
return 0;
}
总结
| 调用者类型 | 指向 / 引用的对象类型 | 可调用的函数版本 |
|---|---|---|
| 普通指针 / 引用(非 const) | 普通对象(非 const) | 优先调用非 const 版本 |
| 普通指针 / 引用(非 const) | const 对象 | 只能调用 const 版本 |
| const 指针 / 引用 | 普通对象(非 const) | 只能调用 const 版本 |
| const 指针 / 引用 | const 对象 | 只能调用 const 版本 |