void func(const char* p); void func(const A& a); 防止函數內部修改引用物件。void func(int x) 已自動複製,加 const 無意義且降低可讀性。// 低效:值傳遞觸發複製建構/解構
void func(A a);
// 高效:const 引用避免複製,const 保護不被修改
void func(const A& a);
內建型別(int、char 等)複製極快,**無需**改為 const int&。
無論指標/引用/值傳遞,輸出參數必須可修改,加 const 會失去輸出功能。
const char* GetString(); // 回傳指標指向的內容不可修改
const A& GetA(); // 回傳引用的物件不可修改
呼叫端必須用 const 接收:const char* p = GetString();
int GetInt() 複製回傳,加 const 無意義。
但 自訂型別 A GetA() 改為 const A& GetA() 可避免複製,**前提是確定只需回傳別名而非副本**(如單例、快取)。
A& operator=(const A& rhs); // 標準:回傳非 const 參考,支援鏈式 a=b=c
const A& operator=(const A& rhs); // 回傳 const 參考,禁止 (a=b)=c 但允許 a=b=c
宣告語法:返回類型 函數名(參數) const; —— const 放在**參數列表後、函數體前**。
const 物件**只能呼叫 const 成員函數**;非 const 物件可呼叫所有。const 物件透過指標維護的物件**仍可修改**(指標本身是 const,指向物件不受影響)。class Stack {
int m_num;
int m_data[100];
public:
int GetCount() const { // 邏輯上唯讀,宣告 const
// ++m_num; // 編譯錯誤:修改資料成員
// Pop(); // 編譯錯誤:呼叫非 const 函數
return m_num;
}
void Push(int); // 非 const
int Pop(); // 非 const
};
被 mutable 修飾的資料成員,**在 const 成員函數中也可修改**。
class Cache {
mutable int hit_count; // 統計計數器,邏輯不影響物件可觀測狀態
std::map cache;
public:
Data Get(int key) const {
++hit_count; // 允許修改
return cache[key];
}
};
適用場景:快取、鎖、統計計數、延遲初始化等「邏輯可觀測狀態不變」但需內部修改的成員。
const T&(非內建型別),輸出勿加 const。const 保護物件,值回傳勿加。const,讓編譯器守護契約。mutable 為特定成員開啟「const 例外」,慎用且註釋說明。