C 語言時代使用 #define BUFSIZE 100 由預處理器進行文字替換。C++ 引入 const 將常量納入編譯器型別系統:
const int bufsize = 100; // 或 const bufsize = 100; (隱含 int)
編譯器可執行常量折疊,例如 char buf[bufsize]; 直接在編譯期確定陣列大小,兼具型別安全與效率。
const 預設具有內部連結,僅在定義它的編譯單元可見。這意味著可在標頭檔直接定義:
// Test.h
const int nTestConst = 1000;
多個 .cpp 包含此標頭檔不會產生重複定義錯誤(非 const 全域變數則會)。若需跨編譯單元共享,必須顯式聲明 extern const int bufsize; 並在單一源文件定義。
需保證數值不變時,應優先使用 const,編譯器將阻止意外修改。
const 可修飾陣列,但需分配記憶體,其值無法在編譯期作為常量表達式使用:
const int i[] = {1, 2, 3, 4};
// float f[i[3]]; // 錯誤:i[3] 非編譯期常量
指標涉及兩個實體:指標本身(儲存地址的變數)與指向的物件。const 位置決定修飾對象:
const int *p; // 或 int const *p;
* p = 20; // 錯誤:無法修改指向的值
p = &other; // 正確:可修改指標指向
語讀法:p 是一個指標,指向 const int。
int d = 1;
int * const p = &d; // 指標本身為常量,初始化後不可改變指向
* p = 2; // 正確:可修改指向的值
// p = &other; // 錯誤:指標不可改變
語讀法:p 是一個 const 指標,指向 int。
以 * 為分界點:
const 在 * 左邊 → 修飾物件值不變(指向 const 的指標)const 在 * 右邊 → 修飾指標不變(const 指標)兩者可組合:const int * const p = &val; —— 指標與指向值皆不可修改。
const 替代 #define 定義常量,獲得型別檢查與作用域控制。const(特別是指標/參考參數),明確語意並防呆。const,允許在 const 物件上呼叫。