const关键字与函数的重载

仅限于类当中的成员函数

这种重载仅适用于成员函数(全局函数无法基于 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 版本
相关推荐
Evand J1 小时前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
BaiPeter2 小时前
ZPL文件预览
开发语言·c++
悠仁さん5 小时前
【C++】哈希表
c++·算法·散列表
Severus_black7 小时前
【C++初阶】list使用及相关实现,思路顺滑流畅!
c语言·数据结构·c++·stl·list
噢,我明白了7 小时前
JAVA中的一些基础应用知识点
java·开发语言
时间的拾荒人8 小时前
Redis 入门详解:核心特性、重要文件与全局命令实战
开发语言·redis·面试
敲上瘾8 小时前
Qt Widgets入门:项目模板解析与Hello World
开发语言·数据库·c++·qt·ui·qt6.3
码途行者9 小时前
网站的SQL 注入:从攻击原理到防御措施
开发语言·sql·php
旖旎夜光10 小时前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
你看我名字10 小时前
产品参数昨天还对,今天已过期:数眼智能与大模型应用如何做资料版本校验
开发语言·架构