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

Effective C++ 条款03:尽可能使用const

Effective C++ 条款03:尽可能使用const


核心思想const 是 C++ 中强大的语义约束工具,能帮助编译器侦测错误、提高代码可读性、并支持编译器优化。

1. 定义常量
const int MAX_SIZE = 100;     // 替换宏定义,类型安全
const std::string NAME = "Alice";

2. 修饰指针
  • 指向常量的指针(底层 const

    const char* p = "Hello";  // 数据不可变
    // p[0] = 'X';            // 错误:禁止修改
    p = "World";              // 允许指向新地址
    
  • 常量指针(顶层 const

    char greeting[] = "Hello";
    char* const p = greeting;  // 指针不可变
    p[0] = 'X';                // 允许修改数据
    // p = greeting + 1;      // 错误:禁止修改指针
    

3. 修饰迭代器
std::vector<int> vec{1, 2, 3};
const std::vector<int>::iterator iter = vec.begin(); // 类似 T* const
*iter = 10;        // 允许修改数据
// iter++;          // 错误:迭代器不可移动std::vector<int>::const_iterator cIter = vec.cbegin(); // 类似 const T*
// *cIter = 20;     // 错误:数据不可修改
cIter++;           // 允许移动迭代器

4. 修饰函数参数与返回值
  • 参数:避免意外修改

    void print(const std::vector<int>& data) {// data.push_back(4);  // 错误:const引用禁止修改for (auto num : data) std::cout << num << " ";
    }
    
  • 返回值:防止误操作

    const int getMagicNumber() { return 42; }
    // getMagicNumber() = 0;  // 错误:返回值不可修改
    

5. const 成员函数
  • 核心作用

    • 标记不修改对象状态的成员函数。
    • 允许 const 对象调用。
  • 示例

    class TextBlock {char* pText;
    public:// const版本:供const对象调用const char& operator[](size_t pos) const {return pText[pos];  // 返回const引用}// 非const版本:供普通对象调用char& operator[](size_t pos) {return pText[pos];  // 返回非const引用}
    };void demo() {const TextBlock ctb("World");TextBlock tb("Hello");tb[0] = 'h';      // 正确:调用非const版本// ctb[0] = 'w';   // 错误:调用const版本,返回值不可修改
    }
    

6. mutable 突破 const 限制
class CachedData {
private:mutable int cache;      // 允许const成员函数修改bool cacheValid = false;
public:int getValue() const {if (!cacheValid) {cache = compute();  // 允许修改mutable成员cacheValid = true;}return cache;}int compute() const { /* ... */ }
};

关键总结

  1. 声明常量时优先使用 const 而非 #define
  2. 使用 const 指针/迭代器明确数据或指针的可变性。
  3. 函数参数传递时,对不改动的对象使用 const& 避免拷贝。
  4. 为不修改成员变量的函数添加 const 修饰符。
  5. 当成员变量需要在 const 函数中修改时,使用 mutable

重要提醒

  • const 成员函数的重载:根据调用对象的 const 性自动选择版本。
  • const 对象可调用 const 成员函数(反之不成立)。
http://www.lryc.cn/news/601009.html

相关文章:

  • 【AcWing 154题解】滑动窗口
  • 【音视频协议篇】WebRTC 快速入门
  • 嵌入式硬件篇---zigbee无线串口通信问题
  • 谷歌无法安装扩展程序解决方法(也许成功)
  • 【C++】stack和queue的模拟实现
  • 机器学习的工作流程
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-30,(知识点:传输线特性阻抗,影响因素)
  • Avantage6.6下载与安装教程
  • 瑞吉外卖学习笔记
  • 兼容性问题记录
  • 亚马逊测评采购:如何打造安全的环境,技术基础关键
  • Python点阵字生成与优化:从基础实现到高级渲染技术
  • JavaScript 立即执行函数(IIFE)运行时行为分析笔记
  • golang实现一个规则引擎,功能包括实时增加、修改、删除规则
  • GO 从入门到精通2
  • 什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?
  • 编程语言Java——核心技术篇(四)集合类详解
  • 【Pandas】pandas Index objects Index.shape
  • 【595驱动8*8点阵】2022-9-11
  • Linux文件系统管理——NFS服务端的安装配置与NFS客户端的安装与挂载实操教程
  • QT核心————信号槽
  • MyBatis-Plus 进阶功能:分页插件与乐观锁的实战指南
  • org.apache.lucene.search.Query#rewrite(IndexSearcher)过时讲解
  • 框架式3D打印机结构设计cad【9张】三维图+设计说明书
  • Windows Server存储池,虚拟磁盘在系统启动后不自动连接需要手动连接
  • vulhub Earth靶场攻略
  • Java:采用mybatis+pagehealper优雅的实现分页功能
  • 文件操作认识
  • connect系统调用及示例
  • 使用Python实现单词记忆软件