const 是 C++ 型別系統的核心關鍵字,提供編譯期常數語意、唯讀保護、優化提示與介面契約。本文系統解析五大應用層面:基本宣告與連結屬性、指標雙重 const 語意、函式參數/回傳值 const 規則、類別成員 const 初始化與成員函式 const 語意、mutable 突破機制,建立完整 const 正確性心智模型。
一、基本宣告與連結屬性
const int r = 100; // 內部連結,編譯期常數替換,必須初始化
extern const int r = 100; // 外部連結,分配記憶體,可分離宣告定義
const int arr[] = {1,2,3,4}; // 常數陣列,分配記憶體,非編譯期常數運算式
關鍵:const 全域變數預設內部連結(C 語言為外部),跨檔案需 extern。
二、指標雙重 const 語意
| 宣告 | 語意 | 指向可變 | 指標可變 |
const int *p / int const *p | 指向常數的指標 | ❌ | ✅ |
int *const p | 常數指標 | ✅ | ❌ |
const int *const p | 指向常數的常數指標 | ❌ | ❌ |
口訣:* 左側 const 修飾指向值,右側 const 修飾指標本身。
三、型別檢查與 const_cast
const T* ← 可接受 T*(增加限制,安全)
T* ← 不可接受 const T*(移除限制,危險)
const int r = 100;
int *p = const_cast<int*>(&r); // C++ 風格強制轉換
// *p = 200; // 未定義行為:修改原本 const 物件
四、函式參數與回傳值 const 規則
| 宣告 | 語意 | 適用場景 |
void f(const int x) | 參數值不可修改 | 傳值參數保護 |
const int f() | 回傳 const 值 | 內建型別無意義(回傳副本),使用者型別防左值修改 |
int f(const char *p) | 參數指向常數 | 保護輸入緩衝區 |
const char* f() | 回傳指向常數指標 | 字串常值、唯讀資料 |
const char* const f() | 回傳常數指向常數指標 | 防修改指向與值 |
void f(const X& x) | const 參考參數 | 避免拷貝、接受臨時物件、保護原物件 |
使用者型別回傳 const 關鍵差異
class X { public: X(int=0); };
X f1(); // 回傳值可作左值:f1() = X(1); ✅
const X f2(); // 回傳 const 禁止左值:f2() = X(1); ❌ 編譯錯誤
五、類別成員 const 機制
1. const 資料成員
- 必須在建構函式成員初始化列表初始化
- 建構函式主體初始化 → 編譯錯誤
- 語法:
X::X(int v) : r(v) {}
2. const 成員函式
class X {
int r;
int f() const; // const 置於參數列表後
};
const 物件只能呼叫 const 成員函式
- 編譯器檢查:const 函式內不可修改非 mutable 成員、不可呼叫非 const 成員函式
- 建構/解構函式不可為 const
3. mutable 突破 const 限制
class X {
mutable int cache; // 可在 const 函式修改
int compute() const {
if (!cached) { cache = expensive(); cached = true; }
return cache;
}
};
適用場景:快取、鎖、統計計數、延遲初始化等邏輯上不影響物件可觀測狀態的內部資料。
4. const_cast 突破(不推薦)
void X::f() const {
const_cast<X*>(this)->r++; // 強制移除 this 的 const
}
僅在無法修改類別定義(如第三方庫)時作為最後手段。
總結
「const 正確性」是 C++ 專業程式碼的標誌:預設所有東西皆為 const,除非需要修改。掌握指標雙重 const、函式參數/回傳 const 語意、類別 const 成員初始化規則、const 成員函式契約、mutable 正當用途,能構建類型安全、自我文檔化、編譯器可優化的高品質程式碼。
- 上一篇文章: C++ #pragma 指令完整解析:常用參數、條件編譯、警告控制與資源嵌入
- 下一篇文章: C++ static 關鍵字完整應用指南:靜態全域、區域、函式與類別成員
Copyright ©
程式碼之家 All Rights Reserved