const int a = 10; —— a 為只讀,編譯期常量(可能進入符號表,不分配內存)。
指針與 const(從右向左讀):
| 聲明 | 含義 | 可修改 |
|---|---|---|
const int* p / int const* p | 指向常量的指針 | *p 不可改,p 可改 |
int* const p | 常量指針 | p 不可改,*p 可改 |
const int* const p | 指向常量的常量指針 | 雙方均不可改 |
void f(const int& x):傳引用避免拷貝,承諾不修改 x。void f(const int* p):同理。const int x 無實際意義(編譯器忽略)。在參數列表後加 const:
class Date {
int month;
public:
int getMonth() const { return month; } // 承諾不修改成員
void setMonth(int m) { month = m; } // 非 const,可修改
};
const 對象只能調用 const 成員函數。mutable 成員可在 const 函數中修改(如緩存、鎖)。const,但可被 const 對象調用。static const int 整型靜態常量:類內初始化(C++11 前僅限整型)。const 成員:必須在構造函數初始值列表初始化(C++11 允許類內默認初始化)。const 加在更嚴格處:int* → const int* 隱式轉換安全。const 需 const_cast,極度危險,僅用於對接無 const 正確性的舊 API。const 的對象通過 const_cast 修改 → 未定義行為。| 特性 | C | C++ |
|---|---|---|
| const 變量本質 | 只讀變量(有內存) | 編譯期常量(可能無內存) |
| 外部鏈接 | 默認 external | 默認 internal(需 extern 導出) |
| 數組長度 | 不可作 VLA 長度 | 可作數組長度(編譯期常量) |