在類成員函數聲明中,若在參數列表後加 const(如 void foo() const;),表示該函數不修改對象的非靜態數據成員。這是一種契約:編譯器會強制檢查函數體內是否有寫入非靜態成員的行為,若有則報錯。
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 string& get_name() const:
const string&,防止調用者通過引用修改私有成員 name。若返回 string&,則允許 stu.get_name() = "Li"; 破壞封裝。
mutable 成員除外)。const(它們本質上在修改對象生存期狀態)。const。const。const T& 避免拷貝並表達只讀意圖。mutable 用於邏輯上不變但物理上需修改的成員(如緩存、鎖、統計計數器)。「該加 const 時就加上」,這不僅是規範,更是讓類在 const 正確性體系中自由流轉的關鍵。