const 用於聲明只讀對象,兩種等價寫法:
const int MAX = 100; // 推薦:const 在類型前
int const MIN = 0; // 合法但少用
| 聲明 | 含義 | 可修改指針 | 可修改所指值 |
|---|---|---|---|
const int* p / int const* p | 指向常量的指針 | 是 | 否 |
int* const p | 常量指針(指針本身不可變) | 否 | 是 |
const int* const p | 指向常量的常量指針 | 否 | 否 |
#include
using namespace std;
int main() {
int val = 10, another = 20;
// 1. 指向常量的指針
const int* p1 = &val;
// *p1 = 20; // 錯誤:不能通過 p1 修改值
p1 = &another; // 正常:可指向別處
// 2. 常量指針
int* const p2 = &val;
*p2 = 30; // 正常:可修改所指值
// p2 = &another; // 錯誤:指針本身不可變
// 3. 雙重 const
const int* const p3 = &val;
// *p3 = 40; // 錯誤
// p3 = &another; // 錯誤
// 4. 讀取技巧:從右向左讀
// const int * const p3
// ↑ ↑
// 指針常量 指向 const int
cout << "val = " << val << endl; // 30
return 0;
}
| 錯誤代碼 | 錯誤信息 (MSVC) | 原因 |
|---|---|---|
const int a; | C2734: 必須初始化常量對象 | 未初始化 |
const int a=1; a=2; | C3892: 不能給常量賦值 | 二次賦值 |
void print(const string& s); // 避免拷貝,承諾不修改
void process(const int* arr, size_t n); // 僅讀數組
class Widget {
int cachedValue;
mutable int accessCount; // 即使在 const 函數中也可修改
public:
int value() const { ++accessCount; return cachedValue; } // const 成員函數
};
const int& ref = 42; // 延長臨時對象生命周期至引用作用域結束
const 是 C++ 類型系統的基石,善用它能:
mutable 緩存模式記住口訣:「右邊修飾左邊,最左邊修飾右邊」,從右向左讀聲明永不出錯。