// 文件作用域
const int globalConst; // 編譯錯誤:const 對象必須初始化
const int globalConst = 42; // 正確
結論:無論局部還是全局,const 變量定義時必須初始化。C++ 標準要求 const 對象在定義時完成賦值,因為其值在編譯期或鏈接期確定,且不可修改。若全局 const 未初始化,編譯器直接報錯(GCC: error: uninitialized const)。
可能產生「全局不需初始化」錯覺的原因:
extern const int x; 是聲明(不分配內存),可不初始化;定義處 const int x = 10; 必須初始化。const 默認外部鏈接,若僅聲明 extern const int x; 並在別處定義,看似「未初始化」實則分離了聲明定義。const int *p 未初始化指向非 const 變量
int a = 5;
const int *p; // 1. 未初始化,p 為野指針
p = &a; // 2. 指向普通 int 變量 ✅ 合法
// *p = 4; // 3. 嘗試通過 p 修改 a ❌ 編譯錯誤
int b = 4;
p = &b; // 4. 改變指向 ✅ 合法
const int *p / int const *p:指向常量的指針(Pointer to const int)。p 修改所指對象的值(*p = ... 非法)。p = &other)。const 或非 const 變量(const int* 隱式轉換自 int*)。a 本身不變為 const,仍可直接 a = 10 修改。int * const p
int a = 5;
int * const p = &a; // 定義時必須初始化,指向固定
*p = 10; // ✅ 可通過 p 修改 a
// p = &b; // ❌ 不可改變指向
const 修飾誰,誰就不可變
const int *p→ const 修飾 *p → *p 不可變(指向的值)
int * const p→ const 修飾 p → p 不可變(指向地址)
const 變量、指針常量、引用,定義時賦值。const T& 或 const T*,防止誤修改,允許綁定臨時對象。const 後綴,支持 const 對象調用。const_cast 移除常量性屬未定義行為,除非確知對象原非 const。掌握 const 的「右左規則」(從變量名向右讀,再向左讀)能秒懂複雜聲明,如 const int * const * p:p 是指針,指向「指向 const int 的常量指針」。