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

C++ const 成員函數完全指南:從語法到設計原則

     編輯:關於C語言

語法與語義:const 放在參數表之後

在類成員函數聲明中,若在參數列表後加 const(如 void foo() const;),表示該函數不修改對象的非靜態數據成員。這是一種契約:編譯器會強制檢查函數體內是否有寫入非靜態成員的行為,若有則報錯。

設計原則:該加就加,不該加別加

  • 只讀操作:getter、查詢、計算等不改狀態的函數,**必須**加 const。
  • 寫入操作:setter、修改狀態的函數,**不能**加 const。

這不僅是語法要求,更是接口契約的一部分,讓使用者一眼知曉副作用。

核心權益:const 對象的調用權

const 成員函數最大的價值在於:**const 對象(或 const 引用/指針)只能調用 const 成員函數**。

class Student {
public:
    const string& get_name() const { return name; } // const 成員
    int get_score() const { return score; }         // const 成員
    void set_student(const string& nm, int sc) {    // 非 const
        name = nm; score = sc;
    }
private:
    string name;
    int score;
};

void output_student(const Student& stu) {
    cout << stu.get_name() << '\t' << stu.get_score() << endl; // OK
    // stu.set_student("Li", 90); // 編譯錯誤:const 對象不可調用非 const 成員
}

若 get_name/get_score 沒加 const,上述代碼將無法編譯,嚴重限制了類的易用性。

返回值 const 與成員 const 的雙重保護

觀察 const string& get_name() const:

  • 後置 const:承諾不修改對象成員。
  • 前置 const:返回 const string&,防止調用者通過引用修改私有成員 name。

若返回 string&,則允許 stu.get_name() = "Li"; 破壞封裝。

const 成員函數的限制

  • 不能修改非靜態數據成員(mutable 成員除外)。
  • 不能調用同類的非 const 成員函數(否則可繞過 const 約束)。
  • 構造函數/析構函數**不能**加 const(它們本質上在修改對象生存期狀態)。

最佳實踐清單

  1. 所有不修改可見狀態的公有成員函數,無一例外加 const。
  2. 返回指針/引用指向內部數據時,返回類型加 const。
  3. 參數為類類型時,優先用 const T& 避免拷貝並表達只讀意圖。
  4. 配合 mutable 用於邏輯上不變但物理上需修改的成員(如緩存、鎖、統計計數器)。

「該加 const 時就加上」,這不僅是規範,更是讓類在 const 正確性體系中自由流轉的關鍵。

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