| 特性 | C 語言 | C++ |
|---|---|---|
| const 變量本質 | 「只讀變量」,有記憶體分配,可取址 | 「編譯期常量」,進入符號表,不一定分配記憶體 |
| 修改行為 | 可透過指標間接修改(未定義行為但常編譯通過) | 嚴格禁止修改,編譯器優化時直接替換為字面值 |
| 作為陣列大小 | 不允許(非編譯期常量) | 允許(編譯期常量表達式) |
| 外部連結屬性 | 預設 external linkage | 預設 internal linkage |
// C 語言
const int a = 10;
int *p = (int *)&a; // 強制轉型移除 const
*p = 11; // 編譯通過,執行時可能修改成功(視平台而定)
printf("%d", a); // 可能輸出 11
關鍵點:C 標準規定修改 const 對象屬於未定義行為,但編譯器通常不阻攔透過指標的修改。const 變量在記憶體中佔據空間,可取地址。
// C++
const int a = 10;
int *p = (int *)&a; // 編譯錯誤:不能將 const int* 轉為 int*
*p = 11; // 無法編譯
// 更進一步:const 可用於編譯期計算
const int ROWS = 10, COLS = 20;
int matrix[ROWS + COLS]; // 合法:ROWS+COLS 為常量表達式
C++ 編譯器將 const 整數型變量(經初始化為常量表達式)視為編譯期常量,直接進入符號表,不分配記憶體(除非取址或外部連結)。因此:
// C 標頭檔
extern const int MAX_SIZE; // C: external linkage
// C++ 使用時
extern "C" const int MAX_SIZE; // 需指定 C 連結,否則 C++ 視為 internal
C 的 const 是「執行期只讀變量」,C++ 的 const 是「編譯期常量」。這一本質差異導致了類型系統、優化策略、連結模型的連鎖不同。跨語言開發時必須明確區分,避免「以 C 思維寫 C++」或反之產生微妙 Bug。