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

C++ const 深度解析:參數、回傳值、成員函數與 mutable 例外

     編輯:關於C語言

const 修飾函數參數

輸入參數:加 const 保護

  • 指標/引用傳遞:void func(const char* p); void func(const A& a); 防止函數內部修改引用物件。
  • 值傳遞:勿加 const。void func(int x) 已自動複製,加 const 無意義且降低可讀性。

非內建型別:優先用 const 引用

// 低效:值傳遞觸發複製建構/解構
void func(A a);

// 高效:const 引用避免複製,const 保護不被修改
void func(const A& a);

內建型別(int、char 等)複製極快,**無需**改為 const int&。

輸出參數:絕不可加 const

無論指標/引用/值傳遞,輸出參數必須可修改,加 const 會失去輸出功能。

const 修飾函數回傳值

指標/引用回傳:加 const 保護物件

const char* GetString(); // 回傳指標指向的內容不可修改
const A& GetA();         // 回傳引用的物件不可修改

呼叫端必須用 const 接收:const char* p = GetString();

值回傳:勿加 const

int GetInt() 複製回傳,加 const 無意義。
但 自訂型別 A GetA() 改為 const A& GetA() 可避免複製,**前提是確定只需回傳別名而非副本**(如單例、快取)。

指派運算子回傳 const 參考

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 放在**參數列表後、函數體前**。

規則

  • 承諾不修改任何非 mutable 資料成員。
  • 不可呼叫非 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 函數中的「特區」

被 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 例外」,慎用且註釋說明。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved