const是C++编译期约束工具,参与类型系统、函数重载、对象生命周期及内存安全;用错会导致编译失败、隐式拷贝、接口不可调用或未定义行为。

const 在 C++ 中不是简单的“只读修饰符”,而是一个编译期约束工具,它参与类型系统、影响函数重载、决定对象生命周期,并直接关系到内存安全和接口设计。用错 const 可能导致编译失败、隐式拷贝开销、无法调用关键接口,甚至引发未定义行为。
const 修饰变量:值不可变,但不等于常量表达式
声明为 const 的变量在初始化后不能被修改,但它不一定是编译期常量(即不一定能用在需要常量表达式的地方):
- int x = 5; const int a = x; // a 是 const,但不是 constexpr —— 初始化依赖运行时值
- constexpr int b = 10; // b 是编译期常量,可作数组大小、模板参数等
- const int c = 20; // c 是 const,若初始化为字面量且无副作用,多数编译器也会视其为常量表达式(但标准不保证)
注意:const int*、int const* 和 int* const 含义完全不同——前者指针所指内容不可改,后者指针本身不可改(地址固定)。
const 成员函数:承诺不修改对象逻辑状态
在成员函数声明末尾加 const(如 void print() const;),表示该函数不会通过 this 指针修改对象的任何非 mutable 成员。这是 const 正确性(const-correctness)的核心:
立即学习“C++免费学习笔记(深入)”;
- 只有 const 成员函数能被 const 对象或 const 引用/指针调用
- 编译器会检查函数体内是否出现对非 mutable 成员的赋值、调用非 const 成员函数等操作
- mutable 成员可在 const 函数中修改(常用于缓存、计数器等不影响逻辑状态的辅助字段)
例如:class Data { mutable int cache_valid; mutable std::string cached_str; }; 允许在 const get_string() 中更新缓存。
const 引用与 const 指针:延长临时对象生命周期 & 安全绑定
const T& 是 C++ 中极重要的惯用法:
- 可绑定到临时对象,且自动延长该临时对象的生命周期至引用作用域结束(const std::string& s = "hello" + std::string(" world"); 合法)
- 可绑定到任意可转换为 T 的类型(支持隐式转换链),而普通引用不行
- 作为函数参数时避免拷贝,又防止意外修改(void process(const std::vector
& v); )
对比:T& 只能绑定到左值;T&& 绑定右值;只有 const T& 能通吃两者并延长临时对象生命。
const 与函数重载、模板推导、返回值设计
const 影响接口的精细控制:
- 可基于 const 重载成员函数:T& operator[] (size_t i); 和 const T& operator[] (size_t i) const; 让 const 对象调用只读版本
- 模板参数推导中,const T& 会保留顶层 const(但底层 const 如 int const* 中的 const 仍会被忽略)
- 返回 const 值(如 const std::string operator+(...))通常多余且有害——阻止移动语义,应避免;但返回 const 引用(const T&)或 const 指针有意义(表明不可修改所指)
不复杂但容易忽略。









