在 C++ 類別設計中,運算子重載是常見技巧。當你看到 const int& operator[](int) const; 這樣的宣告時,前後兩個 const 雖然關鍵字相同,但語意截然不同。搞混它們會導致邏輯錯誤或編譯失敗,因此必須釐清。
位於回傳型別前的 const,表示該函式回傳的是 常數參考。呼叫端無法透過此參考修改回傳的資料,保護了物件內部狀態不被外部竄改。例如:
const int& operator[](int index) const {
return data[index]; // 呼叫端只能讀取,不能寫入
}
若移除此 const,回傳 int& 則允許 obj[0] = 10; 這類賦值操作。
位於參數列表後的 const,屬於 成員函式 cv-limitation,宣告該函式為「常數成員函式」。其效力在於:
mutable)。const 成員函式。const 物件或 const 參考/指標呼叫,提升介面通用性。這種雙重 const 常用於 唯讀存取器,例如容器類別的 operator[] 唯讀版本:
class Array {
int data[100];
public:
// 唯讀版本:const 物件可呼叫,回傳 const 參考防竄改
const int& operator[](int i) const { return data[i]; }
// 讀寫版本:非 const 物件呼叫,回傳非 const 參考允許修改
int& operator[](int i) { return data[i]; }
};
透過函式多載,編譯器會根據物件的常數性自動選擇正確版本,兼顧安全與彈性。
const 只是「不修改參數」——錯,參數本身按值傳遞本來就不可修改,它的作用是限制 this 指標指向的物件內容。mutable 關鍵字——若確需在 const 函式中修改某些成員(如快取、鎖),必須標記為 mutable。const 版本——導致 const 物件無法呼叫,降低程式碼復用性。記住口訣:前 const 守回傳,後 const 守自身。前者保護資料不被外部竄改,後者承諾函式不改變物件狀態。善用雙重 const 重載,能寫出更安全、更符合 C++ 慣用語的程式碼。