const = constant (恆定不變)。被修飾的實體受編譯器強制保護,**預防意外修改,提升健壯性**。諺語:「Use const whenever you need」。
const**,否則失去輸出能力。const。void StringCopy(char* strDestination, const char* strSource);
// strSource 加 const → 函數體內嘗試修改 *strSource 會編譯報錯
函數自動建立副本,**原物件本就安全,加 const 無意義且降低可讀性**。
void Func1(int x); // ✅
void Func1(const int x); // ❌ 無意義
void Func2(A a); // ✅
void Func2(const A a); // ❌ 無意義
// 低效:建構/複製/析構臨時物件
void Func(A a);
// 高效:僅借用別名,無臨時物件開銷
void Func(const A& a); // ✅ 推薦
內建型別 (int, float 等) 無需改引用:複製極快,無建構/析構,引用反而可能因間接存取略慢。
| 參數類別 | 傳遞方式 | 建議 |
|---|---|---|
| 非內建型別 | 輸入 | const Type& (提升效能 + 唯讀保護) |
| 內建型別 | 輸入 | Type (值傳遞即可) |
| 任意型別 | 輸出 | Type* 或 Type& (不可加 const) |
const char* GetString(); // 返回內容不可修改
char* str = GetString(); // ❌ 編譯錯誤
const char* str = GetString(); // ✅
返回值會複製到呼叫端暫存區,**加 const 毫無意義**。
int GetInt(); // ✅
const int GetInt(); // ❌ 無意義
A GetA(); // ✅
const A GetA(); // ❌ 無意義
const A& GetA(); // 避免複製,但呼叫端拿到 const 參考
// ⚠️ 必須確認:要回傳「拷貝」還是「別名」?錯誤會導致懸空參考。
*this 的 const 權衡A& operator=(const A& other); // 標準鏈式賦值 a = b = c
const A& operator=(const A& other); // 禁止 (a = b) = c 這類異常鏈式
標準庫慣用非 const 返回以支援完整鏈式表達,除非刻意限制。