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

[特殊字符]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:给返回值「上锁」(返回只读数据)
  • 组合使用:实现「双保险」安全机制

下次写类成员函数时,先问问自己:

  1. 这个函数需要修改对象吗?(决定是否加函数后的const)
  2. 返回的数据需要保护吗?(决定是否加函数前的const)

理解了这个区别,你的C++代码安全等级直接提升一个Level! 🚀

http://www.lryc.cn/news/531353.html

相关文章:

  • 【字节青训营-7】:初探 Kitex 字节微服务框架(使用ETCD进行服务注册与发现)
  • 给AI用工具的能力——Agent
  • Jupyter Lab的使用
  • 【从零开始的LeetCode-算法】922. 按奇偶排序数组 II
  • RabbitMQ深度探索:前置知识
  • 『 C++ 』中不可重写虚函数的实用案例
  • Redis - String相关命令
  • pytorch基于FastText实现词嵌入
  • 3D人脸建模:高精度3D人脸扫描设备快速生成真人脸部3D模型
  • 4.PPT:日月潭景点介绍【18】
  • 冷链监控系统
  • VSCode中代码颜色异常
  • 表格标签的使用
  • llama.cpp GGUF 模型格式
  • 嵌入式硬件篇---HAL库内外部时钟主频锁相环分频器
  • 【IoCDI】_@Bean的参数传递
  • [特殊字符] ChatGPT-4与4o大比拼
  • 【模型】Bi-LSTM模型详解
  • directx12 3d开发过程中出现的报错 一
  • Ubuntu 24.04 安装 Poetry:Python 依赖管理的终极指南
  • 读写锁: ReentrantReadWriteLock
  • 上海路网道路 水系铁路绿色住宅地工业用地面图层shp格式arcgis无偏移坐标2023年
  • 爬虫学习笔记之Robots协议相关整理
  • Python小游戏29乒乓球
  • 220.存在重复元素③
  • 使用 Go 语言调用 DeepSeek API:完整指南
  • AJAX笔记原理篇
  • ubuntu直接运行arm环境qemu-arm-static
  • 尝试把clang-tidy集成到AWTK项目
  • 一文了解性能优化的方法