首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ 成員函數後的 const 關鍵字詳解:常量成員函數的含義與用法

     編輯:程式設計疑難解答

語法形式


class MyClass {
    int value;
public:
    int getValue() const; // ← 這裡的 const
    void setValue(int v); // 非常量成員函數
};

核心含義

承諾:該函數不會修改對象的任何非靜態成員變量。

  • 編譯器強制檢查:函數體內直接或間接(調用其他非 const 函數)修改 `value` 會報錯。
  • `mutable` 修飾的成員變量除外,可在 const 函數中修改(用於緩存、鎖、計數器等邏輯上不影響對象可見狀態的字段)。

調用規則

對象類型可調用 const 函數可調用非 const 函數
常量對象 (`const MyClass obj`)✅ 是❌ 否
常量引用/指針 (`const MyClass&`, `const MyClass*`)✅ 是❌ 否
非常量對象/引用/指針✅ 是✅ 是

重載區分

同名函數可通過 `const` 區分重載,常見於容器類:


class Vector {
    int* data;
public:
    int& operator[](size_t i) { return data[i]; }       // 非 const 版:可修改
    int  operator[](size_t i) const { return data[i]; } // const 版:只讀
};

常見誤區澄清

  • ❌「const 函數不能修改任何數據」→ ✅ 可修改 `mutable` 成員、全局變量、傳入的引用參數、動態分配的內存內容(指針本身不變)。
  • ❌「const 函數運行效率更高」→ ✅ 編譯器優化機會增加,但非直接性能提升;主要價值在**接口契約**與**常量正確性**。

最佳實踐

  1. 默認加 const:所有不修改狀態的查詢類函數(getter、計算、打印、比較)均應加 `const`。
  2. 參數傳遞:輸入參數用 `const T&`,輸出參數用 `T&` 或 `T*`,避免拷貝且明確意圖。
  3. 迭代器:提供 `const_iterator` 和 `iterator`,配合 `begin() const` / `begin()` 重載。

學習建議

C++ 與數據結構可同步學習。數據結構課程中用到的語言特性有限(指針、引用、類、模板、const 正確性),建議:

  1. 先速通 C++ Primer 第 1-7 章(基礎語法、類、模板)。
  2. 邊學數據結構邊實現:向量、鏈表、棧、隊列、樹、圖,重點練習 `const`、迭代器、異常安全、RAII。
  3. 參考《Effective C++》條款 3、21、28 等深化理解。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved