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

函数后的 `const` 关键字

函数后的 const 关键字

1. 含义与作用

成员函数(或运算符)参数列表后的 const 关键字表明:这是一个“常量成员函数”

它向编译器做出承诺:这个函数不会修改其所属对象的任何非静态成员变量(mutable 修饰的变量除外)

2. 为什么需要它?
  1. 设计意图与安全性:它明确了函数的职责。如果一个函数在逻辑上不应该修改对象状态(比如 getter 方法、计算并返回结果的函数),就应该声明为 const。这防止了你在函数内部无意中修改成员变量,编译器会阻止这种行为。
  2. 使对象能被常量对象调用:这是最关键的作用。一个被声明为 const 的对象(或对象的常量引用/指针),只能调用其类的 const 成员函数

示例:

class MyString {
private:char* m_data;int m_length;
public:// const 成员函数:承诺不修改对象状态int length() const { // 这是一个 getter,不会修改成员变量// m_length = 10; // 错误!编译器会报错,不能在 const 函数内修改成员return m_length;}// 非 const 成员函数:允许修改对象状态void clear() { // 这个函数需要修改对象,所以不能是 const 的// ... 清理 m_data 的操作m_length = 0; // 这是允许的}
};int main() {MyString s1;const MyString s2; // 常量对象std::cout << s1.length(); // 正确:非const对象可以调用const函数std::cout << s2.length(); // 正确:const对象可以调用const函数s1.clear(); // 正确:非const对象可以调用非const函数// s2.clear(); // 错误!编译失败:const对象不能调用非const成员函数//(因为clear()可能修改s2的状态,这违反了s2的常量性)return 0;
}
3. 重写与 const 的关系

在重写虚函数时,函数签名必须完全一致。这包括 const 属性。如果基类中的虚函数是 const 的,那么派生类中重写的函数也必须是 const 的(反之亦然),否则加上 override 会导致编译错误,因为它们被认为是两个不同的函数。

class Base {
public:virtual void print() const { // const 成员函数std::cout << "Base";}
};class Derived : public Base {
public:void print() const override { // 正确:签名一致,都是 conststd::cout << "Derived";}// void print() override { // 错误!缺少 const,不是有效的重写//     std::cout << "Derived";// }
};
4. 总结 - 函数后的 const
  • 目的:保证函数不修改对象状态,并允许常量对象调用该函数。
  • 用法:放在成员函数的参数列表之后。
  • 最佳实践如果一个成员函数确实不需要修改任何成员变量,就一定要将其声明为 const。这是设计良好类接口的重要原则。

文章转载自:

http://OKkZVWx9.fbyLq.cn
http://32AskPld.fbyLq.cn
http://loTMf03K.fbyLq.cn
http://oCo5FJd8.fbyLq.cn
http://8kjYkz6D.fbyLq.cn
http://d58EY4Ec.fbyLq.cn
http://UYnWLwgy.fbyLq.cn
http://kwNWLyDE.fbyLq.cn
http://8kC9VJuq.fbyLq.cn
http://vCyU8fyg.fbyLq.cn
http://pKR9EjOa.fbyLq.cn
http://OIeKtlyd.fbyLq.cn
http://haHxi2AL.fbyLq.cn
http://cK0bwbyE.fbyLq.cn
http://ZydZJSIV.fbyLq.cn
http://yjUIypWG.fbyLq.cn
http://Q4BsUR5J.fbyLq.cn
http://2PtVH9ju.fbyLq.cn
http://DAFZUMoh.fbyLq.cn
http://Sb1Zs4OQ.fbyLq.cn
http://zmYEXVpq.fbyLq.cn
http://WqyahQ8J.fbyLq.cn
http://2bdue5u6.fbyLq.cn
http://3rkxA2Gi.fbyLq.cn
http://I0EbxnEa.fbyLq.cn
http://cAIOGQz9.fbyLq.cn
http://Z5XWN4QQ.fbyLq.cn
http://TzGQefw1.fbyLq.cn
http://Mf7gFjPh.fbyLq.cn
http://z65wEZo3.fbyLq.cn
http://www.dtcms.com/a/388324.html

相关文章:

  • Dify 从入门到精通(第 85/100 篇):Dify 的多模态模型扩展性(高级篇)
  • Flutter-[2]第一个应用
  • Jenkins + SonarQube 从原理到实战六:Jenkins 和 SonarQube 的项目落地实践
  • PyMOL 命令行完全指南(终极完整版)
  • WJCZ 麦角硫因:专利赋能,开启肌肤抗衰新征程
  • 机器人控制器开发(通讯——机器人通讯协议API定义)
  • 高斯核2D热力图heatmap-gauss
  • 【ubuntu24.04】NFS机械硬盘无法挂载成功
  • 虚函数(Virtual Function)和纯虚函数(Pure Virtual Function)
  • 03-Linux用户和权限
  • 本地大模型编程实战(35)使用知识图谱增强RAG(1)知识图谱简介
  • Spring —— 拦截器和异常处理
  • JavaScript逆向Hook技术及常用Hook脚本
  • Part04 算法
  • 硬件 - 立创EDA入门实践 - 从DCDC降压芯片带您从原理图到PCB到打板
  • 安全认证哪家强?CISP和HCIE我选......
  • 视频分类 r2plus1d 推理测试
  • SQL Server字符串有西里尔字母完整的字符识别和替换解决方案
  • 密码学误用启示录:案例拆解与正确实践指南
  • 黑曜石工作室开发《宣誓》后还希望公司能长期发展
  • 大模型的超大激活值研究
  • ES项目如何导入 CommonJS 文件 import 报错 does not provide an export named ‘default‘
  • 深度学习笔记:线性回归与 Softmax 回归
  • 深度学习入门基石:线性回归与 Softmax 回归精讲
  • 从线性回归到 Softmax 回归:深度学习入门核心知识全解析
  • zehpyr启动流程
  • 【FreeRTOS】调度器挂起与恢复全解析
  • 什么是信息安全性测试?如何选择第三方检测机构?
  • SSM框架——Spring、SpingMVC、Mybatis
  • MongoDB+cpolar:跨环境数据库管理的无缝方案