首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

高品質 C++/C 程式設計指南 第 11 章 (上):const 關鍵字的進階妙用

     編輯:關於C++

11.1 const:不只是常數,更是「防呆護盾」

const = constant (恆定不變)。被修飾的實體受編譯器強制保護,**預防意外修改,提升健壯性**。諺語:「Use const whenever you need」。

11.1.1 修飾函數參數:輸入參數的守護神

核心原則

  • 輸出參數 (需回傳結果):**絕不可加 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);       // ❌ 無意義

非內建型別:值傳遞 → const 引用傳遞 (效能雙贏)

// 低效:建構/複製/析構臨時物件
void Func(A a);

// 高效:僅借用別名,無臨時物件開銷
void Func(const A& a); // ✅ 推薦

內建型別 (int, float 等) 無需改引用:複製極快,無建構/析構,引用反而可能因間接存取略慢。

總結表:「const &」修飾輸入參數決策樹

參數類別傳遞方式建議
非內建型別輸入const Type& (提升效能 + 唯讀保護)
內建型別輸入Type (值傳遞即可)
任意型別輸出Type* 或 Type& (不可加 const)

11.1.2 修飾函數返回值

指標/引用返回 + const

const char* GetString(); // 返回內容不可修改
char* str = GetString(); // ❌ 編譯錯誤
const char* str = GetString(); // ✅

值返回 + const

返回值會複製到呼叫端暫存區,**加 const 毫無意義**。

int GetInt();           // ✅
const int GetInt();     // ❌ 無意義
A GetA();               // ✅
const A GetA();         // ❌ 無意義

非內建型別返回引用 + const (效能與語義權衡)

const A& GetA(); // 避免複製,但呼叫端拿到 const 參考
// ⚠️ 必須確認:要回傳「拷貝」還是「別名」?錯誤會導致懸空參考。

賦值運算子返回 *this 的 const 權衡

A& operator=(const A& other); // 標準鏈式賦值 a = b = c
const A& operator=(const A& other); // 禁止 (a = b) = c 這類異常鏈式

標準庫慣用非 const 返回以支援完整鏈式表達,除非刻意限制。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved