const在C++中核心作用是声明不可修改性,用于变量、指针、引用、成员函数等,确保只读语义,提升安全性、可读性与编译器优化能力,并构成const正确性的契约基础。

const 在 C++ 中的核心作用是**声明不可修改性**,它告诉编译器和程序员:这个值、对象、指针、引用或函数行为在特定作用域内是只读的。这种约束不仅提升代码安全性与可读性,还为编译器优化提供依据。
修饰变量和基本类型
最常见用法:定义编译期或运行期常量,防止意外修改。
- const int x = 10; —— x 不能被重新赋值(编译期常量,若用字面量初始化且为整型,可能参与常量表达式)
- int y = 5; const int z = y; —— z 是运行期常量(run-time const),值由 y 决定,但之后不可改
- 建议用 constexpr 替代简单整型 const(如 constexpr int max_size = 100;),它更明确表示编译期常量
修饰指针:三种常见组合
const 和指针结合时,关键看 const 紧邻谁——左边?右边?这决定“什么不可变”。
- int* const ptr1 = &x; —— 指针本身是 const(ptr1 不能指向别处),但 *ptr1 可改
- const int* ptr2 = &x; 或 int const* ptr2 = &x; —— 指针所指内容是 const(*ptr2 不可改),但 ptr2 可重新赋值
- const int* const ptr3 = &x; —— 指针和其所指内容都不可变(双重只读)
- 口诀:“左定值,右定址”(const 在 * 左边 → 值不可变;在 * 右边 → 地址不可变)
修饰引用
引用必须初始化,且天生不可重绑定,因此 const 修饰的是它所引用的对象:
立即学习“C++免费学习笔记(深入)”;
- const int& r = x; —— r 是 x 的只读别名,通过 r 不能修改 x;但 x 本身仍可被其他非 const 途径修改
- 常用于函数参数:避免拷贝 + 防止修改实参,例如 void print(const std::string& s);
- 允许绑定到临时对象(如 const int& r = 42;),延长其生命周期至引用作用域结束
修饰成员函数
加在函数声明末尾(int get() const;),表示该函数承诺不修改当前对象的任何非 mutable 成员:
- const 成员函数内部不能调用非 const 成员函数,也不能修改非 mutable 数据成员
- const 对象只能调用 const 成员函数;非 const 对象两者都可调用(编译器自动选择更匹配的重载)
- mutable 成员可在 const 函数中修改(常用于缓存、计数器等逻辑上不影响对象“状态”的字段)
- 重载时可仅靠 const 区分:例如 T& operator[] (size_t i); 和 const T& operator[] (size_t i) const;
修饰返回值(较少见但有用)
控制函数返回后能否被修改或赋值:
- const std::string getName() const; —— 返回值是 const,调用者不能对返回的临时 string 调用非 const 成员(如 getName().clear(); 非法)
- 对内置类型(如 const int foo();)意义不大,因返回的是副本;但对类类型,可防止链式调用中的误操作
- 注意:不要返回局部变量的 const 引用(悬垂引用),也不建议返回 const 值来阻止移动(反而禁用 move 语义)
基本上就这些。const 不是装饰,而是契约——它让接口意图清晰、减少 bug、支持 const 正确性设计。写代码时多问一句:“这里该不该、能不能改?” 答案往往是 const 的起点。









