当前位置: 首页 > news >正文

函数重载const,可以作为判断

const 修饰符可以作为函数重载的依据之一,但仅限于成员函数(member functions)。

成员函数:const可以用于重载(关键区别!)

C++ 允许通过成员函数是否为const成员函数来重载。

#include <iostream> using namespace std; class MyClass { public: void print() { cout << "Non-const version" << endl; } void print() const { // ← 注意:const 成员函数 cout << "Const version" << endl; } }; int main() { MyClass obj1; const MyClass obj2; obj1.print(); // 调用 non-const 版本 obj2.print(); // 调用 const 版本 return 0; }

原理:

  • 成员函数的const修饰符实际上是修饰隐含的this指针:
    • 普通成员函数:MyClass* this
    • const成员函数:const MyClass* this
  • 因此,函数签名不同,构成合法重载。

重载规则:

调用对象类型优先调用哪个版本?
const对象const成员函数(更匹配)
const对象只能调用const成员函数
临时对象(右值)通常调用const版本(除非有&&重载)

扩展:const+ 引用/指针参数也可用于重载(非成员函数)

虽然const intvsint不行,但const T&vsT&是可以的

void func(int& x) { cout << "Modifiable lvalue" << endl; } void func(const int& x) { cout << "Const or rvalue" << endl; } int main() { int a = 10; const int b = 20; func(a); // 调用 func(int&) —— a 可修改 func(b); // 调用 func(const int&) —— b 是 const func(42); // 调用 func(const int&) —— 字面量是右值,只能绑定到 const 引用 return 0; }

这是因为:

  • int&不能绑定到const对象或右值
  • const int&可以绑定到任何int类型(左值、右值、const)

所以引用/指针的const性会影响函数签名,可用于重载。

const能否用于重载?

场景能否重载?说明
按值传参的const(如const int❌ 否签名相同,编译器视为同一函数
成员函数的const修饰符✅ 是this指针类型不同,构成重载
T&vsconst T&参数✅ 是引用类型不同,可重载
T*vsconst T*参数✅ 是指针指向类型不同,可重载
  • 为类提供const和非const版本的成员函数(如operator[]at()data()等)
  • 使用const成员函数表示“不修改对象状态”的操作
  • 利用const T&重载来区分可修改与只读访问

成员函数的 const(修饰 this 指针)

写在成员函数声明/定义的末尾

class MyClass { public: void print() const; // ← const 在这里 };

含义:

  • 表示该成员函数不会修改调用对象的任何非 mutable 成员变量
  • 实际上是将隐含的this指针从MyClass* this变为const MyClass* this
  • 函数内部不能调用非const成员函数,也不能修改成员变量(除非标记为mutable)。

用途:

  • 提高程序安全性(接口契约:此函数只读)
  • 允许const对象调用该函数
  • 支持重载(与非const版本构成重载)

参数上的const——修饰函数参数本身

位置:

写在参数类型前面或中间,属于参数声明的一部分。

void func(const int x); // 按值传参加 const void func(const MyClass& obj); // 引用传参加 const void func(const char* str); // 指针指向的内容为 const

含义:

  • 表示在函数内部不能通过该参数修改所引用/指向的数据
  • 对调用者无影响(尤其是按值传递时)。
  • 是一种实现保护,防止函数内部误改参数。

用途:

  • 防止意外修改(尤其对指针/引用)
  • 允许传入const对象或字面量(如func("hello")要求参数是const char*
  • 对于引用/指针,会影响函数签名,可用于重载
void printName(const string& name) { // name = "Alice"; // ❌ 不能修改,因为是 const 引用 cout << name; } string s = "Bob"; printName(s); // ✅ OK printName("Charlie"); // ✅ 字面量也能传(必须用 const&)
特性void f() const(成员函数 const)参数上的const(如const T& x
修饰对象当前对象(this指针)函数的某个参数
影响范围整个成员函数体仅该参数在函数内的使用
能否修改成员变量❌ 不能(除非mutable⚠️ 不相关(参数不是成员)
是否影响函数签名✅ 是(可与非 const 重载)✅ 对引用/指针是;❌ 对按值参数不是
调用限制const对象只能调用const成员函数无限制,但决定能否传const实参
适用函数类型仅成员函数所有函数(成员/非成员)

常见误区澄清

❌ 误区1:void f(const int x)void f(int x)是重载?

不是!按值传参时,const不属于函数签名。
这两个声明会被视为同一个函数,导致重定义错误。

❌ 误区2:成员函数加const是为了“参数安全”?

不是!它是为了“对象状态安全”,和参数无关。

http://www.jsqmd.com/news/432212/

相关文章:

  • 2026年晾衣架厂家推荐:常州富阁尔鑫饰日用品,手摇/电动/落地/户外全系晾衣架供应 - 品牌推荐官
  • C# 注册码生成与验证机制实现方案
  • Oleic acid-modified Fe₃O₄ nanoparticles (10 nm),成分与性质
  • 2026年3月黑枸杞厂家榜单,花青素含量高实力厂家 - 品牌鉴赏师
  • 大模型测评完全指南:2026 年主流 LLM 评测体系、榜单解读与选型建议
  • 旗舰专业级高端家用音箱怎么选?小白必看品类认知+机型指南 - 包罗万闻
  • 2026雨水收集系统优质厂家推荐指南:生活不锈钢水箱/组合式不锈钢水箱/雨水收集系统模块/304不锈钢水箱/选择指南 - 优质品牌商家
  • LangGraph V1.0入门教程:轻松构建复杂Agent应用,小白也能学会!收藏必备
  • 2026安全评价哪家强?五大专业机构推荐,宇然全过程咨询以“环评水保社稳+职卫检测”一体化服务重塑行业标杆 - 深度智识库
  • 【log】Rust `log` 库详解
  • 多线程池:假设我有日志、邮件、线索录入、秒杀活动四大线程池,CPU核数8核,我怎么初始化这几个线程池,其中日志、邮件为I/O密集型,线索录入为混合型、秒杀活动为计算型
  • 2026智慧KTV品牌推荐榜 潮聚高性价比之选 - 真知灼见33
  • 微服务多个线程池正常工作后,每个线程池都持续拥有CPU核数的线程不释放,会有什么影响吗
  • 2026天津A-Level课程中心选哪个?国际知名的天津A-Level国际高中及教学质量推荐 - 品牌2026
  • 2026 CTP顶尖产品有哪些?国内外七大品牌深度横向对比测评 - 匠言榜单
  • 收藏!小白程序员轻松入门大模型:DO-RAG实战指南
  • 收藏必备!小白程序员必看:大模型如何赋能金融行业?深度解析与应用攻略
  • 全屋定制板材厂家如何选择更可靠?2026年终十大热门品牌横向评测,最终推荐亦木良品!终身质保,极致环保 - 十大品牌榜
  • React中 state值根据props传入值变化的静态方法 getDerivedStateFromProps
  • 录音室级监听音响全面对比|旗舰机型实测,精准还原原声本色 - 包罗万闻
  • 灵活用工 SaaS 系统开发指南:从业务痛点到可运行源码实现
  • 外贸推广获客平台推荐,2026年 Facebook、LinkedIn 、TikTok、Google 海外营销推广获客公司精选 - 品牌2026
  • 征服LLM评估:EleutherAI/lm-evaluation-harness 如何成为你的秘密武器
  • 985学姐私货大公开:中期报告写作技巧+高效AI论文写作工具分享 - 资讯焦点
  • Openclaw常用命令
  • 深度解析利用 IP 验证与位运算绕过检测的新型 Googlebot 拦截木马
  • 2026年全自动吸料机哪家质量好?这5个品牌用户口碑炸裂! - 品牌推荐大师1
  • 2026泰国人力资源服务商推荐:泰国名义雇主EOR服务商深度盘点 - 品牌2026
  • 建议收藏!2026年十大电线信号线品牌榜单发布,西南“隐形冠军”揭秘 - 深度智识库
  • 2026欧洲人力资源服务商推荐:海外雇佣欧洲名义雇主EOR服务商盘点 - 品牌2026