掌握「右左法則」:從變量名出發,向右找修飾,向左找類型。
例:const int * const p → p 是 const 指針 → 指向 const int。
const int MAX_SIZE = 100; // 編譯期常量,替代 #define
const double PI = 3.1415926;
const char *const GREETING = "Hello"; // 指針與內容皆不可變
優於宏:有類型、有作用域、可調試、可取地址。
| 聲明 | 口訣 | 指針可變? | 內容可變? | 典型用途 |
|---|---|---|---|---|
const int *pint const *p | 指向常量的指針 | 是 | 否 | 函數參數 const char *str |
int *const p | 常量指針 | 否(須初始化) | 是 | 固定緩衝區指針 |
const int *const p | 指向常量的常量指針 | 否 | 否 | 只讀配置表指針 |
// 輸入參數:防止誤修改,接受字面量/const/非 const 實參
void print(const char *str); // 內容不可改
void process(const BigStruct &obj); // 引用傳參避免拷貝,且只讀
// 返回值:防止調用者修改內部數據
const char *getConfig() { return config; }
// 成員函數:承諾不修改對象狀態
class Date {
int year, month, day;
public:
int getYear() const { return year; } // const 成員函數
// void setYear(int y) const { year = y; } // 編譯錯誤!
};
class Circle {
const double radius; // 常量成員:僅能在初始化列表賦值
mutable int cacheArea; // 可變成員:即使 const 對象也可修改
public:
Circle(double r) : radius(r), cacheArea(0) {}
double area() const {
if (!cacheArea) cacheArea = 3.14 * radius * radius; // 修改 mutable
return cacheArea;
}
};
T* → const T*:隱式允許(增加限制)const T* → T*:需 const_cast(危險,違反承諾)T& → const T&:隱式允許const T& → T&:需 const_castint** → const int** 禁止(可間接修改 const),需轉為 const int* const*constmutable 用於緩存、鎖、引用計數等不影響可觀測狀態的內部機制const 是 C/C++類型系統的基石,也是接口契約的核心。熟練掌握四大用法、轉換規則、mutable 機制,能讓編譯器幫你攔截大量邏輯錯誤,寫出更安全、可維護的代碼。