| 聲明 | 含義 | 迭代器可變 | 元素可變 |
const_iterator | 指向 const 元素的迭代器 | 是 | 否 |
const iterator | const 的迭代器(須初始化) | 否 | 取決於 iterator 類型 |
4. 指向 const 對象的指針
const double* cptr; // 指針可變,指向內容不可變
const double pi = 3.14;
cptr = π // OK
*cptr = 2.71; // Error
double dval = 3.14;
cptr = &dval; // OK,但仍不可通過 cptr 修改 dval
常用作函數參數保證不修改實參:void func(const int* p);
5. const 指針(指針本身不可變)
int errNumb = 0;
int* const curErr = &errNumb; // 必須初始化
*curErr = 1; // OK,修改指向對象
curErr = nullptr; // Error,指針本身不可變
6. 指向 const 的 const 指針
const double pi = 3.14159;
const double* const pi_ptr = π // 雙重 const,指針與指向內容均不可變
讀法:從右向左——pi_ptr 是 const 指針,指向 const double。
7. 成員函數 const 限定
class MyClass {
mutable int cache_; // 可在 const 函數中修改
int value_;
public:
int getValue() const { return value_; } // 不修改成員
int getCached() const { // 邏輯 const,物理修改 cache
if (!cached_) { cache_ = compute(); cached_ = true; }
return cache_;
}
void setValue(int v) { value_ = v; } // 非 const
};
const 成員函數隱式 this 為 const MyClass*,不可修改非 mutable 成員。
mutable 允許邏輯不可變但物理可變的成員(緩存、鎖、統計計數)。
- 重載決議區分
const/非 const 對象調用。
8. 最佳實踐總結
- 默認變量、參數、返回值、成員函數盡量加
const,表達不可變意圖,編譯器強制執行。
- 指針/引用參數優先
const T& 或 const T*。
- 迭代器遍歷只讀用
cbegin()/cend() 或 const_iterator。
mutable 僅用於不影響對象可觀測狀態的內部機制。
- 構造函數/析構函數不能是
const。
- 上一篇文章: C++Builder 處理 Windows 消息機制:從訊息結構到自定義消息實戰
- 下一篇文章: C++ explicit 關鍵字詳解:禁止構造函數隱式轉換
Copyright ©
程式碼之家 All Rights Reserved