[特殊字符]const在函数前后的作用详解(附经典案例)
理解const
在函数前后的位置差异,是掌握C++精髓的重要一步。下面用几个超形象的例子,带你彻底搞懂这个知识点!
情况1:const在函数后面(成员函数限定符)
作用:承诺这个成员函数不会修改对象的状态(相当于给函数里的this
指针加const)
class ShoppingCart {
public:// 普通版本:可以修改购物车void addItem(string item) { items.push_back(item); }// const版本:只读查看购物车void showItems() const { // ← 注意这里的const// items.push_back("彩蛋"); // 错误!const函数不能修改成员for(auto& item : items) {cout << item << endl;}}private:vector<string> items;
};
使用场景对比:
// 非const对象:可以调用所有函数
ShoppingCart myCart;
myCart.addItem("iPhone"); // ✔ 正常调用
myCart.showItems(); // ✔ 调用const版本// const对象:只能调用const成员函数
const ShoppingCart& readOnlyCart = myCart;
// readOnlyCart.addItem("iPad"); // ❌ 报错!const对象不能调用非const函数
readOnlyCart.showItems(); // ✔ 只能调用const版本
实际意义:
- 像给函数发的「只读工作证」:const成员函数保证不修改对象内部状态
- 允许const对象调用(否则const对象什么都做不了)
- 提高代码安全性(避免意外修改)
情况2:const在函数前面(返回值修饰)
作用:返回只读数据,防止返回值被意外修改
示例1:返回const指针
class Student {
public:const string* getNamePtr() const { return &name; // 返回const指针,外部无法通过指针修改}private:string name = "小明";
};// 使用示例
Student stu;
const string* pName = stu.getNamePtr();
// *pName = "大明"; // ❌ 错误!不能通过const指针修改值
示例2:返回const引用(常用在操作符重载)
class BankAccount {
public:const double& getBalance() const { return balance; // 返回const引用,防止外部直接改余额}private:double balance = 1000.0;
};// 使用示例
BankAccount account;
const double& money = account.getBalance();
// money = 5000.0; // ❌ 错误!不能通过const引用修改
实际意义:
- 像给返回值贴「封条」:保护返回的数据不被修改
- 常用于返回类内部数据的引用/指针
- 避免暴露内部数据的修改权限
🔥 超强组合技:函数前后都有const
class SecretDocument {
public:// 前后都有const:既不会修改对象,又返回只读内容const string& getContent() const { return content; }private:string content = "绝密文件";
};// 使用示例
const SecretDocument doc;
const string& text = doc.getContent();
// text[0] = 'X'; // ❌ 双重保护,无法修改
⚡ 重点对比表
位置 | 代码示例 | 作用对象 | 典型用途 |
---|---|---|---|
函数后 | void func() const | 成员函数本身 | 保证不修改对象状态 |
函数前 | const T& func() | 返回值 | 防止返回值被意外修改 |
💡 灵魂总结
- 函数后的const:管住函数的「手」(不能修改成员变量)
- 函数前的const:给返回值「上锁」(返回只读数据)
- 组合使用:实现「双保险」安全机制
下次写类成员函数时,先问问自己:
- 这个函数需要修改对象吗?(决定是否加函数后的const)
- 返回的数据需要保护吗?(决定是否加函数前的const)
理解了这个区别,你的C++代码安全等级直接提升一个Level! 🚀
相关文章:
[特殊字符]const在函数前后的作用详解(附经典案例)
理解const在函数前后的位置差异,是掌握C精髓的重要一步。下面用几个超形象的例子,带你彻底搞懂这个知识点! 情况1:const在函数后面(成员函数限定符) 作用:承诺这个成员函数不会修改对象的状态&…...

【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)
本文目录 一、Kitex概述二、第一个Kitex应用三、IDL四、服务注册与发现 一、Kitex概述 长话短说,就是字节跳动内部的 Golang 微服务 RPC 框架,具有高性能、强可扩展的特点,在字节内部已广泛使用。 如果对微服务性能有要求,又希望…...

给AI用工具的能力——Agent
ReAct框架: Reason Action,推理与行动结合 可以借助思维链,用小样本提示展示给模型一个ReAct框架 推理:针对问题或上一步观察的思考 行动:基于推理,与外部环境的一些交互(调用外部工具&…...

Jupyter Lab的使用
Lab与Notebook的区别: Jupyter Lab和Jupyter notebook有什么区别,这里找到一篇博客不过我没细看, Jupyter Lab和Jupyter Notebook的区别 - codersgl - 博客园 使用起来Lab就是一个更齐全、功能更高级的notebook, 启用滚动输出: 有时候一个…...

【从零开始的LeetCode-算法】922. 按奇偶排序数组 II
给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 任何满足上述条件的…...

RabbitMQ深度探索:前置知识
消息中间件: 消息中间件基于队列模式实现异步 / 同步传输数据作用:可以实现支撑高并发、异步解耦、流量削峰、降低耦合 传统的 HTTP 请求存在的缺点: HTTP 请求基于响应的模型,在高并发的情况下,客户端发送大量的请求…...
『 C++ 』中不可重写虚函数的实用案例
文章目录 框架设计:保障核心逻辑稳定避免误操作:防止逻辑混乱确保接口一致:库与API设计 在C编程里,用final关键字修饰、不允许被继承(重写)的虚函数其实很有用。接下来我就结合实际案例,给大家讲…...

Redis - String相关命令
目录 setgetmsetmgetsetnx、setex、psetexincr、incrby、decr、decrby、incrbyfloatappendgetrangesetrangestrlen字符串类型编码方式总结 Redis - String Redis存储的字符串,是直接按二进制方式存储,不会做任何编码转换,存的是什么ÿ…...

pytorch基于FastText实现词嵌入
FastText 是 Facebook AI Research 提出的 改进版 Word2Vec,可以: ✅ 利用 n-grams 处理未登录词 比 Word2Vec 更快、更准确 适用于中文等形态丰富的语言 完整的 PyTorch FastText 代码(基于中文语料),包含࿱…...

3D人脸建模:高精度3D人脸扫描设备快速生成真人脸部3D模型
什么是3D人脸建模? 3D人脸建模,即借助特定技术手段,获取人脸三维数据,并构建出能精准呈现人脸形状、纹理等特征的三维模型。这一技术广泛应用于计算机视觉、人机交互、虚拟现实、影视制作等多个领域,为各行业都带来了前所未有的创…...

4.PPT:日月潭景点介绍【18】
目录 NO1、2、3、4 NO5、6、7、8 NO9、10、11、12 表居中或者水平/垂直居中单元格内容居中或者水平/垂直居中 NO1、2、3、4 新建一个空白演示文稿,命名为“PPT.pptx”(“.pptx”为扩展名)新建幻灯片 开始→版式“PPT_素材.doc…...

冷链监控系统
前后端源码 wx :bright12389 冷链系统需求分析 1. 项目背景 冷链系统用于监控和管理冷链物流过程中的环境参数(如温度、湿度),确保货物在运输、存储过程中的质量安全。系统需支持实时监控、历史数据分析、异常告警等功能。 2.…...

VSCode中代码颜色异常
检查右下角语言模式是否是HTML, 如果不是就点击更改为HTML模式即可...

表格标签的使用
一.表格标签 1.1表格标签的作用 用来显示和展示数据,不是用来布局页面的。 1.2表格的基本语法 <table> //用于定义表格标签 <tr> // table row 用于定义表格中的行,必须嵌套在<table> </table>标签中 <td>单元格内的文…...

llama.cpp GGUF 模型格式
llama.cpp GGUF 模型格式 1. Specification1.1. GGUF Naming Convention (命名规则)1.1.1. Validating Above Naming Convention 1.2. File Structure 2. Standardized key-value pairs2.1. General2.1.1. Required2.1.2. General metadata2.1.3. Source metadata 2.2. LLM2.2.…...
嵌入式硬件篇---HAL库内外部时钟主频锁相环分频器
文章目录 前言第一部分:STM32-HAL库HAL库编程优势1.抽象层2.易于上手3.代码可读性4.跨平台性5.维护和升级6.中间件支持 劣势1.性能2.灵活性3.代码大小4.复杂性 直接寄存器操作编程优势1.性能2.灵活性3.代码大小4.学习深度 劣势1.复杂性2.可读性3.可维护性4.跨平台性…...

【IoCDI】_@Bean的参数传递
目录 1. 不创建参数类型的Bean 2. 创建一个与参数同类型同名的Bean 3. 创建多个与参数同类型,其中一个与参数同名的Bean 4. 创建一个与参数同类型不同名的Bean 5. 创建多个与参数同类型但不同名的Bean 对于Bean修饰的方法,也可能需要从外部传参&…...
[特殊字符] ChatGPT-4与4o大比拼
🔍 ChatGPT-4与ChatGPT-4o之间有何不同?让我们一探究竟! 🚀 性能与速度方面,GPT-4-turbo以其优化设计,提供了更快的响应速度和处理性能,非常适合需要即时反馈的应用场景。相比之下,G…...

【模型】Bi-LSTM模型详解
1. 模型架构与计算过程 Bi-LSTM 由两个LSTM层组成,一个是正向LSTM(从前到后处理序列),另一个是反向LSTM(从后到前处理序列)。每个LSTM单元都可以通过门控机制对序列的长期依赖进行建模。 1. 遗忘门 遗忘…...
directx12 3d开发过程中出现的报错 一
报错:“&”要求左值 “& 要求左值” 这个错误通常是因为你在尝试获取一个临时对象或者右值的地址,而 & 运算符只能用于左值(即可以放在赋值语句左边的表达式,代表一个可以被引用的内存位置)。 可能出现错…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...