1. C++ const 关键字的本质理解
const 关键字在 C++ 中远不止是一个简单的修饰符,它实际上构建了一种编译期的契约机制。当我们在代码中声明某个对象为 const 时,相当于向编译器承诺:"这个对象在其生命周期内不会被修改"。编译器则会严格检查这个承诺是否被遵守,任何违反承诺的操作都会导致编译错误。
1.1 const 的基本语义
const 的核心语义是"不可变性",但这种不可变性在不同上下文中有着微妙差异:
- 对象常量性:对于普通变量,const 表示该变量的值不可更改
cpp复制const int MAX_SIZE = 100;
MAX_SIZE = 200; // 编译错误:试图修改const变量
- 指针常量性:指针场景下需要区分"指向常量的指针"和"常量指针"
cpp复制const char* p1; // 指向常量的指针(内容不可变)
char* const p2; // 常量指针(指针本身不可变)
const char* const p3; // 指向常量的常量指针
- 引用常量性:引用本质上就是常量指针,所以const引用只有一种形式
cpp复制const int& ref = x; // 通过ref无法修改x的值
1.2 const 与类型系统
C++ 的类型系统将 const 视为类型的一部分,这导致了一些有趣的类型转换规则:
- const 转换方向:非const可以隐式转换为const,反之则不行
cpp复制int x = 10;
const int* p = &x; // OK
int* q = p; // 错误:丢掉const限定
- 顶层const与底层const:这是理解复杂const声明的关键
cpp复制const int* p; // 底层const(指向的对象是const)
int* const p; // 顶层const(指针本身是const)
提示:理解"顶层/底层const"概念对阅读复杂声明非常有帮助。顶层const表示对象本身是常量,底层const表示指向/引用的对象是常量。
2. const 的高级应用场景
2.1 函数签名中的const
const 在函数声明中有三种主要用法,每种都有其特定语义:
- const 参数:防止函数内部修改参数值
cpp复制void print(const std::string& str) {
// str[0] = 'A'; // 错误:不能通过const引用修改
std::cout << str;
}
- const 返回值:通常用于返回引用或指针,防止调用者修改
cpp复制const int& getMax(const std::vector<int>& vec) {
return *std::max_element(vec.begin(), vec.end());
}
- const 成员函数:承诺不修改对象状态(除mutable成员外)
cpp复制class MyArray {
public:
int get(int index) const {
return data[index];
}
pri
