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

C++学习笔记23:const 成员函数

目录一、为什么需要 const 成员函数二、const 成员函数的写法三、const 修饰的到底是什么四、const 成员函数不能修改成员变量五、const 对象和普通对象的调用规则1. const 对象只能调用 const 成员函数2. 普通对象可以调用 const 成员函数3. 普通对象也可以调用普通成员函数六、成员函数之间的调用规则1. 普通成员函数可以调用 const 成员函数。2. const 成员函数不能调用普通成员函数七、在日期类中的应用八、构造函数和析构函数能不能加 const九、const 成员函数和 const 引用参数的关系十、小结一、为什么需要 const 成员函数在C中如果一个对象被 const 修饰那么这个对象就不能被修改。例如const Date d(2024, 5, 1);这里 d 是一个 const 对象表示它的内容不能被修改。如果我们写一个普通成员函数void Print() { cout _year - _month - _day endl; }然后让 const 对象调用它const Date d(2024, 5, 1); d.Print();这时可能会编译错误。原因是普通成员函数没有承诺不修改对象而 const 对象不允许被修改。所以 C 提供了const 成员函数。二、const 成员函数的写法const 成员函数就是在成员函数参数列表后面加上 const。例如void Print() const { cout _year - _month - _day endl; }完成示例#include iostream using namespace std; class Date { public: Date(int year 2024, int month 1, int day 1) { _year year; _month month; _day day; } void Print() const { cout _year - _month - _day endl; } private: int _year; int _month; int _day; }; int main() { const Date d(2024, 5, 1); d.Print(); return 0; }运行结果2024-5-1加上 const 后const 对象就可以正常调用 Print() 了。三、const 修饰的到底是什么成员函数后面的 const本质上修饰的是隐藏的 this 指针指向的对象。普通成员函数中this 指针可以理解为Date* const this也就是this 指针本身不能改变指向的 但 this 指向的对象可以被修改而 const 成员函数中this 指针可以理解为const Date* const this也就是说this 指针本身不能改变 this 指向的对象也不能被修改。所以在 const 函数中不能修改成员变量。四、const 成员函数不能修改成员变量例如void Print() const { _year 2025; // 错误 cout _year - _month - _day endl; }这段代码会报错。原因是 Print() 被声明成了 const 成员函数函数内部不能修改点给钱对象的成员变量。所以 const 成员函数适用于只读取对象数据不修改对象状态的函数比如void Print() const; bool operator(const Date d) const; bool operator(const Date d) const; int GetMonthDay(int year, int month) const;五、const 对象和普通对象的调用规则成员函数调用时有一套权限规则。1. const 对象只能调用 const 成员函数const Date d(2024, 5, 1); d.Print();如果 Print() 是普通成员函数就可能报错。应该写成void Print() const { cout _year - _month - _day endl; }2. 普通对象可以调用 const 成员函数Date d(2024, 5, 1); d.Print();如果 Print() 是 const 成员函数普通对象也可以调用。因为普通对象权限更大调用只读函数属于权限缩小是安全的。3. 普通对象也可以调用普通成员函数Date d(2024, 5, 1); d.Print();普通对象本来就可以修改所以可以调用普通成员函数。简单总结对象类型普通成员函数const成员函数普通对象可以调用可以调用const对象不能调用可以调用六、成员函数之间的调用规则成员函数内部也会涉及到 const 权限问题。1. 普通成员函数可以调用 const 成员函数。class Date { public: void Func1() { Func2(); } void Func2() const { cout Func2 endl; } };这是可以的。因为普通成员函数中的 this 是 Date*调用 const 成员函数时可以转换换成 const Date*属于权限缩小。2. const 成员函数不能调用普通成员函数class Date { public: void Func1 const () { Func2(); // 错误 } void Func2() { cout Func2 endl; } };这是错误的。因为 const 成员函数中的 this 是 const Date*如果调用普通成员函数就相当于把 const Date* 转成 Date*属于权限放大不允许。七、在日期类中的应用之前写日期类比较运算符时可写成这样bool operator(const Date d) { return _year d._year _month d._month _day d._day; }这个函数知识比较日期不会修改当前对象。所以更规范的写法应该是bool operator(const Date d) const { return _year d._year _month d._month _day d._day; }同理下面这些比较函数也应该加 constbool operator(const Date d) const; bool operator(const Date d) const; bool operator(const Date d) const; bool operator(const Date d) const; bool operator!(const Date d) const;这样 const Date 对象也可以正常调用这些函数。哪些成员函数应该加 const判断标准很简单只要这个成员函数不修改成员变量就应该加 const。不能加 const 的函数一般是会修改对象的比如Date operator(int day); Date operator-(int day); Date operator(); Date operator--();八、构造函数和析构函数能不能加 const构造函数和析构函数不能写成 const 成员函数例如下面这种写法是错误的Date() const { } ~Date() const { }原因是构造函数和析构函数本身负责对象的初始化和清理不属于普通成员函数调用的场景。所以构造函数不能加 const 析构函数不能加 const九、const 成员函数和 const 引用参数的关系实际写代码时函数经常会此写成void Func() (const Date d) { d.Print(); }这里 d 是 const Date也就是一个只读对象。如果 Print() 没有加 constvoid Print() { }那么d.Print();就会报错。所以如果一个对象可以 const 引用形式传参那么它调用的成员函数也应该是 const 成员函数。这也是为什么在日期类中Print()、比较运算符等不修改对象的函数 都应该加上const。十、小结本篇主要学习了C中的 const 成员函数。需要记住const 成员函数是成员函数参数列表后面加 constconst 成员函数的本质是限制 this指针指向的对象不能修改普通对象可以调用普通成员函数和const 成员函数const 对象只能调用 const 成员函数const 成员函数内部不能修改成员变量普通成员函数可以调用 const 成员函数const 成员函数不能调用普通成员函数不修改成员变量的函数都建议加 const构造函数和析构函数都不能加 const日期类中的比较函数、打印函数通常都应该写成 const 成员函数。const 成员函数是写规范C类代码时非常重要的知识点。理解它之后就能很好的处理 const 对象、const 引用参数以及成员函数之间的调用权限问题。

相关文章:

C++学习笔记23:const 成员函数

目录 一、为什么需要 const 成员函数? 二、const 成员函数的写法 三、const 修饰的到底是什么? 四、const 成员函数不能修改成员变量 五、const 对象和普通对象的调用规则 1. const 对象只能调用 const 成员函数 2. 普通对象可以调用 const 成员函…...

Blender 3MF插件:实现CAD到3D打印的无缝转换完整指南

Blender 3MF插件:实现CAD到3D打印的无缝转换完整指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在3D打印和数字制造领域,3D Manufacturing F…...

终结拟合式智能:记忆博弈心智架构重塑硅基生命进化逻辑

当前全球AGI研发赛道,正陷入一场难以破局的同质化内卷。无论是头部科技企业的超大参数模型,还是轻量化垂直AI产品,核心底层始终沿用Transformer概率拟合逻辑。这套技术体系虽然实现了人工智能的规模化落地,却从根源上锁死了AI的智…...

从概率拟合到内生心智:七层投影架构重构AGI数字生命新范式

自2017年Transformer架构问世以来,人工智能领域正式迈入大模型迭代时代。十余年间,千亿、万亿参数模型不断涌现,依托自注意力机制的概率拟合算法,AI在文本生成、多模态交互、逻辑问答等领域实现了规模化突破,彻底改变了…...

3步搞定显卡风扇异常:用FanControl彻底解决NVIDIA风扇噪音和转速问题

3步搞定显卡风扇异常:用FanControl彻底解决NVIDIA风扇噪音和转速问题 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitH…...

Supervisely完整指南:5步打造AI视觉标注神器

Supervisely完整指南:5步打造AI视觉标注神器 【免费下载链接】supervisely Supervisely SDK for Python - convenient way to automate, customize and extend Supervisely Platform for your computer vision task 项目地址: https://gitcode.com/gh_mirrors/su…...

B/S架构模式在校园管理系统中的应用研究

随着校园信息化建设的不断普及,各类校园管理系统层出不穷,系统架构模式直接决定系统的使用便捷性、运维难度与适配场景。传统C/S架构即客户端/服务器架构,需要用户下载安装专属客户端,存在部署繁琐、升级困难、跨终端适配差、运维…...

MyBatis-Plus持久层框架应用技术研究

在Web应用系统开发过程中,数据持久层承担着数据库交互、数据读写、数据统计、条件查询的核心作用,持久层框架的性能与便捷性直接决定项目开发效率与系统运行稳定性。传统MyBatis框架虽能够实现数据库增删改查操作,但存在代码冗余、重复代码多…...

《技术底稿 40》别只看文件大小:一次 “反常 OOM” 背后的内存缓存重构

一、反常现象:小文件报错,大文件反倒正常业务场景需批量导入文献类 ZIP 压缩包。本次测试出现诡异问题:一个 282MB 的 ZIP 包导入时,直接抛出 java.lang.OutOfMemoryError: Java heap space 堆内存溢出。当前服务 JVM 堆内存固定配…...

基于Spring Security与JWT的权限认证技术研究

在高校信息化管理系统中,数据安全与权限隔离是系统设计的核心重点。学生奖惩信息属于高校学生核心隐私数据,包含学生奖励记录、违纪处分记录、档案信息、审批流程信息等敏感内容,若缺乏完善的权限管控机制,极易出现数据泄露、越权…...

如何让微信聊天记录成为你的数字记忆银行?WeChatMsg完全指南

如何让微信聊天记录成为你的数字记忆银行?WeChatMsg完全指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we…...

从能算到秒杀:单词拆分与「能否拼出来」的判定艺术

如果说 完全平方数​ 是在算「最少几个数」,零钱兑换​ 是在算「最少几枚硬币」,那 139. 单词拆分​ 就是在考你:一个字符串,到底能不能被“拼”出来?这也是我第一次意识到:很多 DP 题,其实是在…...

终极指南:Visual C++运行库合集AIO - 一站式解决Windows程序依赖问题

终极指南:Visual C运行库合集AIO - 一站式解决Windows程序依赖问题 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经在运行某些软件或游戏时…...

为什么你的Windows快捷键突然失效?Hotkey Detective一键定位占用程序终极指南

为什么你的Windows快捷键突然失效?Hotkey Detective一键定位占用程序终极指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-d…...

10M参数也能跑ARC与数独,Bengio团队押注「多轨迹推理」

10M 参数跑到数独 97%,GRAM 把递归推理改成多轨迹采样。 10M 参数,在大模型时代显得有些微不足道。 但 Yoshua Bengio 团队与 KAIST、Mila、NYU 研究人员提出的 GRAM,用这个量级的模型跑出了几组值得注意的结果。 在 Sudoku-Extreme 上准确率…...

3步彻底解决Windows更新后开始菜单重置难题:ExplorerPatcher深度解析与实战

3步彻底解决Windows更新后开始菜单重置难题:ExplorerPatcher深度解析与实战 【免费下载链接】ExplorerPatcher This project aims to enhance the working environment on Windows 项目地址: https://gitcode.com/GitHub_Trending/ex/ExplorerPatcher 每次Wi…...

模拟几种数据融合协作频谱感知技术在认知无线电应用中性能研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

【顶级EI复现】考虑用户行为基于扩散模型的电动汽车充电场景生成( Python + PyTorch代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…...

【顶级EI复现】基于去噪概率扩散模型(DDPM)的电动汽车充电行为场景生成研究( Python + PyTorch实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…...

中性点不接地系统或中性点经消弧线圈接地系统的小电流接地故障仿真研究(Simulink仿真实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 &#x1f381…...

终极指南:如何用ESP32-A2DP库快速构建蓝牙音频设备

终极指南:如何用ESP32-A2DP库快速构建蓝牙音频设备 【免费下载链接】ESP32-A2DP A Simple ESP32 Bluetooth A2DP Library (to implement a Music Receiver or Sender) that supports Arduino, PlatformIO and Espressif IDF 项目地址: https://gitcode.com/gh_mir…...

神州细胞递表港交所 创新生物制药领军者构筑A+H双平台全球化版图

5月22日,北京神州细胞生物技术集团股份公司(证券代码:688520,证券简称:神州细胞)正式向香港联合交易所有限公司递交上市申请,迈出“AH”双资本平台布局的关键一步。公司以科创板上市为根基&…...

2026年阿里云OpenClaw/Hermes Agent配置Token Plan部署一文读懂

2026年阿里云OpenClaw/Hermes Agent配置Token Plan部署一文读懂。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成流程详解

2026年腾讯云OpenClaw/Hermes Agent配置Token Plan集成流程详解。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具&…...

2026年京东云OpenClaw/Hermes Agent配置Token Plan保姆级搭建分享

2026年京东云OpenClaw/Hermes Agent配置Token Plan保姆级搭建分享。OpenClaw是开源的个人AI助手,Hermes Agent则是一个能自我进化的AI智能体框架。阿里云提供计算巢、轻量服务器及无影云电脑三种部署OpenClaw 与 Hermes Agent的方案、百炼Token Plan兼容主流 AI 工具…...

React Props:深入解析组件间的数据传递

React Props:深入解析组件间的数据传递 在React中,组件间的数据传递是构建复杂应用的关键。Props(属性)是React组件间数据传递的主要方式,它允许父组件向子组件传递数据。本文将深入探讨React Props的概念、使用方法以及注意事项。 一、Props的概念 Props是React组件的…...

终极指南:在Windows系统上完整解锁MacBook Pro Touch Bar功能

终极指南:在Windows系统上完整解锁MacBook Pro Touch Bar功能 【免费下载链接】DFRDisplayKm Windows infrastructure support for Apple DFR (Touch Bar) 项目地址: https://gitcode.com/gh_mirrors/df/DFRDisplayKm 还在为MacBook Pro在Windows系统中Touch…...

基于taotoken多模型能力在ubuntu构建智能客服路由系统

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 基于taotoken多模型能力在ubuntu构建智能客服路由系统 在构建智能客服系统时,一个常见的挑战是如何平衡响应质量与成本…...

从选刊到综述:GPT到底在学术写作上升级了什么?

各位同仁好,我是七哥。一个在高校里从事人工智能相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude等大模型学术实操相关问题,多多交流,相互成就,共同进步。 导师把选题报告打回来,批注栏里写着:“创新点不够清晰,建议重新梳理研…...

英雄联盟智能助手:League Akari 完全使用指南与本地化优势解析

英雄联盟智能助手:League Akari 完全使用指南与本地化优势解析 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League Akari是一款…...