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

【C++ 函数后面加 const 的深度解析】

文章目录【C核心概念】常量成员函数const member function规则原理实战指南一、核心结论先划重点二、底层原理this指针的常量转换三、核心特性与实战示例1. 对象调用权限最核心场景2. mutableconst方法的“例外”3. const重载精准控制读写四、进阶用法避免代码重复五、常见陷阱与避坑指南1. 错误1const方法修改非mutable成员2. 错误2const方法调用非const方法3. 错误3const方法返回非const内部引用暴露修改权六、最佳实践按优先级排序总结【C核心概念】常量成员函数const member function规则原理实战指南一、核心结论先划重点成员函数后的const是编译期常量正确性检查的核心✅ 承诺函数不修改对象的逻辑状态mutable成员除外✅ 允许const对象调用该函数非 const 函数不可✅ 可参与函数重载编译器根据对象的常量性选择对应版本❌ 无运行时开销仅为编译器的静态检查机制。二、底层原理this指针的常量转换成员函数的const本质是修改this指针的类型classMyClass{public:voidfunc()const;// const成员函数voidfunc();// 非const成员函数};// 编译器视角的this指针隐式参数// const版本this → const MyClass*voidfunc(constMyClass*this);// 非const版本this → MyClass*voidfunc(MyClass*this);const成员函数中this是只读指针无法通过它修改对象成员非const成员函数中this是可写指针可修改成员。三、核心特性与实战示例1. 对象调用权限最核心场景对象类型调用const成员函数调用非const成员函数const对象✅ 允许❌ 编译错误非const对象✅ 允许✅ 允许classPerson{std::string name;public:std::stringgetName()const{returnname;}// const方法只读voidsetName(conststd::stringn){namen;}// 非const方法写};voidprintPerson(constPersonp){// 正确const对象调用const方法std::coutp.getName()std::endl;// 错误const对象调用非const方法编译报错// p.setName(Alice);}intmain(){Person p;p.setName(Bob);// 非const对象调用非const方法std::coutp.getName()std::endl;// 非const对象调用const方法constPerson cp;std::coutcp.getName()std::endl;// const对象调用const方法return0;}2. mutableconst方法的“例外”mutable修饰的成员变量可在const方法中修改用于存储“非逻辑状态”如计数、锁classCache{mutablestd::mutex mtx;// 互斥锁与逻辑状态无关可修改mutableboolcacheValidfalse;// 缓存状态mutablestd::vectorintdata;// 核心数据不可在const方法修改public:voidrefreshCache()const{std::lock_guardstd::mutexlock(mtx);// 修改mutable的mtxif(!cacheValid){data{1,2,3};// ❌ 错误修改非mutable成员cacheValidtrue;// ✅ 允许修改mutable成员}}};使用原则mutable仅用于“不影响对象逻辑状态”的成员如计数器、锁、缓存标记禁止滥用。3. const重载精准控制读写通过const重载实现“读-写分离”是STL容器如std::vector的核心设计classTextBuffer{std::string texthello;public:// 非const版本返回可修改引用写charoperator[](size_t pos){std::cout非const版本\n;returntext[pos];}// const版本返回只读引用读constcharoperator[](size_t pos)const{std::coutconst版本\n;returntext[pos];}};intmain(){TextBuffer buf;buf[0]H;// 调用非const版本修改constTextBuffer cbuf;charccbuf[0];// 调用const版本只读// cbuf[0] H; // 错误const版本返回const引用无法修改return0;}输出非const版本 const版本四、进阶用法避免代码重复让非const方法调用const方法减少重复逻辑核心技巧classDataWrapper{std::vectorintdata{1,2,3,4,5};public:// const版本核心逻辑边界检查返回值constintat(size_t pos)const{if(posdata.size())throwstd::out_of_range(越界);returndata[pos];}// 非const版本复用const版本逻辑移除constintat(size_t pos){returnconst_castint(static_castconstDataWrapper*(this)-at(pos));}};intmain(){DataWrapper dw;dw.at(0)10;// 非const版本修改值std::coutdw.at(0)std::endl;// 输出10constDataWrapper cdw;std::coutcdw.at(0)std::endl;// const版本只读return0;}关键逻辑static_castconst DataWrapper*(this)将当前对象转为const调用const版本的at()const_castint移除返回值的const仅在非const方法中安全。五、常见陷阱与避坑指南1. 错误1const方法修改非mutable成员classAccount{doublebalance100.0;public:voiddeductFee()const{balance-5.0;// ❌ 编译错误const方法修改普通成员}};2. 错误2const方法调用非const方法classLogger{voidlog(conststd::stringmsg){/* 写日志非const */}public:voidprintLogs()const{log(print start);// ❌ 编译错误const方法调用非const方法}};3. 错误3const方法返回非const内部引用暴露修改权classConfig{std::mapstd::string,std::stringsettings;public:// ❌ 危险const方法返回非const引用外部可修改内部状态std::mapstd::string,std::stringgetSettings()const{returnsettings;}};// 外部修改const对象的内部状态违背const承诺constConfig cfg;cfg.getSettings()[key]value;六、最佳实践按优先级排序最小权限原则所有不修改对象状态的成员函数都声明为const如Getter、计算方法、打印方法const正确性传播const方法返回的内部数据应为const如const T避免暴露修改权慎用mutable仅用于计数器、锁、缓存等“非逻辑状态”禁止修改核心业务数据const重载需要区分“读”和“写”的接口如operator[]必须提供const/非const两个版本复用const逻辑非const方法通过const_cast调用const方法避免代码重复。总结核心本质const成员函数通过修改this指针类型承诺不修改对象逻辑状态是编译期的静态检查核心价值支持const对象调用实现“常量正确性”提升代码健壮性关键技巧const重载实现读写分离mutable处理非逻辑状态非const方法复用const逻辑避坑重点禁止const方法修改普通成员、调用非const方法、返回非const内部引用。正确使用const成员函数是C进阶的关键标志能显著提升代码的可读性、安全性和可维护性。

相关文章:

【C++ 函数后面加 const 的深度解析】

文章目录【C核心概念】常量成员函数(const member function):规则原理实战指南一、核心结论(先划重点)二、底层原理:this指针的常量转换三、核心特性与实战示例1. 对象调用权限(最核心场景&…...

基于Maxwell的8极12槽内置式永磁同步电机设计探索

基于maxwell的8极12槽内置式永磁同步电机设计。 模型包含"一"字型和"V"型转子结构的永磁电机。 具体参数:800w 1500rpm 定子外径110mm 额定电压12V.可用于学习永磁电机建模和"一"字型和"V"型转子结构永磁电机的性能分析对…...

Unsloth实战指南:用GSM8K数据集训练你的第一个推理模型

Unsloth实战指南:用GSM8K数据集训练你的第一个推理模型 1. Unsloth框架简介 Unsloth是一个开源的LLM微调和强化学习框架,旨在让人工智能训练变得更加高效和易用。这个框架的核心优势在于: 训练速度提升2倍:通过优化的算法和底层…...

MATLAB计算超表面远场效果:多个图表与CST、HFSS仿真结果的快速比对

MATLAB计算超表面的远场效果,多个图代替表征CST,HFSS仿真计算结果。 用仿真软件需要几个小时出结果,MATLAB可以几秒钟出结果,两者的结果是一样的。 可以计算三维远场,近场,theta,phi等等。 画图…...

1.1.1+1.1.3 操作系统的概念、功能

首先来看一下大家熟悉的操作系统都有哪些,苹果电脑使用的操作系统是MacOS,苹果的手机使用的操作系统是IOS,但是对于我自己来说,还是比较喜欢安卓和Windows操作系统。对于普通老百姓来说,可能百分之九十九的人都在使用这…...

3分钟打造专业简历:Magic Resume完全指南

3分钟打造专业简历:Magic Resume完全指南 【免费下载链接】magic-resume free online AI resume editor 项目地址: https://gitcode.com/GitHub_Trending/ma/magic-resume 还在为制作简历而烦恼吗?传统简历编辑器要么功能简陋,要么操作…...

告别原生界面:威联通QNAP Docker安装Transmission并升级Web控制台

威联通QNAP Docker部署Transmission全攻略:从基础配置到Web控制台升级 威联通QNAP作为一款功能强大的网络存储设备,其Docker支持能力为用户提供了极大的扩展性。本文将详细介绍如何在QNAP上通过Container Station部署Transmission这一轻量级BT客户端&…...

Lychee多模态重排序模型实战:使用curl/API调用方式集成至现有检索系统

Lychee多模态重排序模型实战:使用curl/API调用方式集成至现有检索系统 1. 引言:为什么需要多模态重排序? 在现代信息检索系统中,用户的需求越来越复杂。传统的文本检索已经无法满足用户对图片、视频等多模态内容的需求。想象一下…...

专业Git工作流优化:Tower在macOS平台上的深度实践指南

专业Git工作流优化:Tower在macOS平台上的深度实践指南 【免费下载链接】awesome-macOS  A curated list of awesome applications, softwares, tools and shiny things for macOS. 项目地址: https://gitcode.com/GitHub_Trending/aw/awesome-macOS 在mac…...

android下nfc使用

最近在使用nfc功能,总结一下一、安卓打开ap有两种方法,一种使用createApplicationRecord()方法,一种使用createExternal()方法。二、如果想不仅打开app,还要传递参数,createExternal()只用一条记录即可,cre…...

金三银四求职攻略|校招社招双线突围,短期上岸+长期成长一步到位

金三银四求职攻略|校招 & 社招双线突围,短期上岸 长期成长一步到位 年后求职黄金窗口已开启,金三银四从来不是盲目投递的狂欢,而是精准规划的战场。 校招生拼潜力、社招人拼战力,两类人群需求截然不同、打法更需…...

最少拍控制器的3个致命缺陷:为什么你的实验总达不到理想波形?

最少拍控制器的3个致命缺陷:为什么你的实验总达不到理想波形? 在计算机控制技术的实验教学中,最少拍控制器(Deadbeat Controller)常被视为快速响应系统的理想解决方案。理论上,它能在有限采样周期内使系统输…...

如何快速掌握Python HTTP客户端urllib3:面向新手的完整教程指南

如何快速掌握Python HTTP客户端urllib3:面向新手的完整教程指南 【免费下载链接】urllib3 urllib3 is a user-friendly HTTP client library for Python 项目地址: https://gitcode.com/gh_mirrors/ur/urllib3 在Python的世界里,HTTP请求处理是每…...

GME-Qwen2-VL-2B-Instruct辅助操作系统概念学习:图解进程、线程与内存管理

GME-Qwen2-VL-2B-Instruct辅助操作系统概念学习:图解进程、线程与内存管理 操作系统这门课,是不是让你又爱又恨?爱的是它作为计算机的“大管家”,逻辑严密,体系完整;恨的是那些进程、线程、内存、调度&…...

2025技术解析:从原理到落地的AuraSR全流程实践

2025技术解析:从原理到落地的AuraSR全流程实践 【免费下载链接】AuraSR 项目地址: https://ai.gitcode.com/hf_mirrors/fal/AuraSR 在数字图像应用中,如何在有限硬件资源下实现高质量图像超分辨率重建一直是行业难题。当我们需要将低分辨率图像放…...

人脸识别模型镜像实测:Retinaface+CurricularFace快速部署,效果超预期

人脸识别模型镜像实测:RetinafaceCurricularFace快速部署,效果超预期 1. 开箱即用的人脸识别解决方案 最近在测试各种人脸识别方案时,我偶然发现了CSDN星图平台上的RetinafaceCurricularFace镜像。这个预置环境让我眼前一亮——它不仅包含了…...

深入解析MachOView:macOS开发者必备的二进制分析神器

深入解析MachOView:macOS开发者必备的二进制分析神器 【免费下载链接】MachOView MachOView fork 项目地址: https://gitcode.com/gh_mirrors/ma/MachOView 在macOS和iOS开发领域,MachOView二进制分析工具是每一位专业开发者都必须掌握的核心工具…...

旧物新生:用魅蓝Note5 root后搭建家用Linux服务器(部署宝塔/AList/QB)

廉颇老矣,尚能饭否?我手上有两条魅蓝Note5,一个改了直供电没有屏幕,一个屏幕爆裂,控制位置只有四分之一屏幕。,卡顿难忍,但它那颗64位ARM处理器和大电池,其实正是一台天然的、低功耗…...

【CLion+Keil】无缝迁移:在CLion中高效开发与管理Keil工程

1. 为什么要在CLion中开发Keil工程? 作为一名嵌入式开发者,我经常遇到这样的困扰:团队其他成员使用Keil MDK开发STM32项目,而我想用CLion这个更现代的IDE。Keil虽然稳定可靠,但代码补全、重构、调试等功能确实不如CLio…...

避坑指南:LoadRunner11破解版常见安装错误及解决方案

LoadRunner11非官方版本安装全流程避坑手册 写在前面:工具选择的风险与替代方案 在性能测试领域,LoadRunner曾是行业标杆工具,但官方已停止对11版本的技术支持。许多技术团队由于历史项目兼容性或预算限制,仍在尝试使用非官方渠道…...

ThingsBoard CE租户权限精细化控制:从管理员到普通用户的权限分配实战

1. ThingsBoard CE租户权限体系解析 第一次接触ThingsBoard权限系统时,我也被各种角色搞得晕头转向。经过三个项目的实战踩坑,终于摸清了这套权限体系的精髓。简单来说,ThingsBoard CE社区版的权限架构就像一家公司的组织架构:系统…...

避坑指南:CentOS离线安装Maven常见报错解决方案(含SHA校验)

企业级CentOS离线安装Maven全流程避坑手册 在金融、军工等对网络隔离要求严格的行业环境中,开发团队常面临无法直接联网安装工具的困境。上周某银行项目组就遇到这样的场景:内网服务器需要部署Maven构建环境,但安全策略禁止任何外网连接。技术…...

终极Go语言正则表达式指南:从入门到精通的模式匹配技巧

终极Go语言正则表达式指南:从入门到精通的模式匹配技巧 【免费下载链接】go The Go programming language 项目地址: https://gitcode.com/GitHub_Trending/go/go Go语言作为一门高效、简洁的编程语言,其标准库中的正则表达式包为开发者提供了强大…...

新装Win10必看:如何绕过BitLocker自动激活?保姆级避坑指南

新装Win10系统如何规避BitLocker自动激活:技术流解决方案全解析 每次新装Windows 10系统时,不少用户都会遇到一个令人困扰的问题——BitLocker自动激活的提示。那个黄色的小锁图标不仅影响视觉体验,更可能在不经意间触发全盘加密,…...

什么是WAF防火墙,WAF防火墙都有哪些功能

WAF都有哪些分类 WAF从形态上可分为硬件WAF、WAF防护软件和云WAF。 硬件WAF通常串行部署在Web服务器前端,用于检测、阻断异常流量。通过代理技术代理来自外部的流量,并对请求包进行解析,通过安全规则库的攻击规则进行匹配,如成功…...

机器人表征与人类对齐:从ROS基础到具身智能大模型

引言在机器人领域中,始终存在一个核心难题:如何让机器人理解人类意图,并将其转化为自己的动作?这个问题贯穿了机器人发展的各个阶段——从早期的示教再现,到经典的ROS控制框架,再到今天的具身智能大模型。无…...

人工智能气象学入门:从卷积神经网络理解伏羲模型预报原理

人工智能气象学入门:从卷积神经网络理解伏羲模型预报原理 天气预报这事儿,咱们都熟悉。小时候看《新闻联播》后的天气预报,觉得挺神奇。后来知道,那是靠超级计算机跑“数值预报”算出来的,过程复杂,耗时也…...

Dify评估结果不可复现?资深架构师首次公开内部trace日志解析工具链与12类随机性锚点固化方案

第一章:Dify自动化评估系统不可复现性问题的本质剖析Dify 的自动化评估系统在实际落地过程中频繁遭遇结果不可复现的困境,其根源并非单一配置失误或随机种子遗漏,而是多层耦合因素共同作用下的系统性缺陷。核心矛盾在于评估流程中隐式状态依赖…...

Ubuntu20.04下ORB-SLAM3复现全流程:从环境配置到避坑指南(附Opencv4.2.0/Eigen3.3.7适配方案)

Ubuntu 20.04下ORB-SLAM3完整复现指南:从环境配置到实战调试 在视觉SLAM领域,ORB-SLAM3作为当前最先进的开源方案之一,其复现过程往往成为研究者进入这一领域的"敲门砖"。不同于简单的算法调用,完整的ORB-SLAM3复现涉及…...

如何突破性掌握阴阳师自动化脚本:从新手到专家的完整成长路径

如何突破性掌握阴阳师自动化脚本:从新手到专家的完整成长路径 【免费下载链接】OnmyojiAutoScript Onmyoji Auto Script | 阴阳师脚本 项目地址: https://gitcode.com/gh_mirrors/on/OnmyojiAutoScript 阴阳师自动化脚本是一款革命性的游戏辅助工具&#xff…...