const 用於聲明「只讀」語義,增強代碼健壯性,幫助編譯器優化。以下是五大核心使用場景:
const int a = 10; // 推薦風格:const 在類型前 int const b = 20; // 等價,但較少用
兩者效果完全一致,編譯器均視為常量,需初始化且不可修改。
| 聲明 | 含義 | 口訣 |
|---|---|---|
const int* p / int const* p | 指向常量的指針:指向的值不可修改,指針可指向別處 | const 在 * 左 → *左邊內容不可變 |
int* const p | 常量指針:指針本身不可修改(不可指向別處),指向的值可修改 | const 在 * 右 → *右邊指針不可變 |
const int* const p | 指向常量的常量指針:指針與指向的值雙重不可變 | 兩側都有 const → 雙重保護 |
void func(const Type& param) { ... } // 參數在函數內不可修改
void func(const Type* ptr) { ... } // 指向的內容不可修改
常用於引用/指針參數,防止誤修改實參,也允許傳入臨時對象或 const 對象。
const int foo() { return 42; } // 返回 const 值(內置類型通常忽略)
const MyClass& bar() { ... } // 返回 const 引用,防止修改內部狀態
返回 const 內置類型無實際意義(臨時對象本身不可修改);返回 const 引用/指針可保護對象不被調用者修改。
class A {
int val;
public:
int getVal() const { return val; } // 承諾不修改任何成員變量
// void setVal(int v) const { val = v; } // 編譯錯誤:const 函數不能修改成員
};
const 放在參數列表後,表示該函數不修改對象狀態(mutable 成員除外)。const 對象只能調用 const 成員函數。
int const* const p → "p is a const pointer to a const int")。