1.介紹
? ? ? ? 在C++中,mutable是一個關鍵字,用于修飾類的成員變量。它的主要作用是允許在常量成員函數或常量對象中修改被標記為mutable的成員變量。通常情況下,常量成員函數不能修改類的成員變量,但有些情況下,某些成員變量的修改并不影響對象的邏輯狀態(例如緩存、計數器等)。這時可以使用 mutable來允許這些變量在常量成員函數中被修改。
2.特點
? ? ? ? (1)允許在常量成員函數中修改。mutable變量可以在常量成員函數中被修改,而普通成員變量不行。
? ? ? ? (2)不影響對象的邏輯狀態。mutable通常用于那些不影響對象外部可見狀態的變量,例如緩存、調試計數器等。
? ? ? ? (3)常量對象也可以修改mutable變量。即使對象是const的,mutable變量仍然可以被修改。
3.使用語法
class MyClass {
public:mutable int mutableVar; // 使用 mutable 修飾int normalVar;void modify() const {mutableVar = 10; // 正確:mutable 變量可以在常量成員函數中修改// normalVar = 20; // 錯誤:不能修改普通成員變量}
};
4.使用場景
? ? ? ? (1)緩存數據
????????如果某個成員變量用于緩存計算結果,且計算成本較高,可以使用mutable來允許在常量成員函數中更新緩存。
class Cache {
private:mutable bool cacheValid;mutable int cachedValue;int expensiveCalculation() const {// 模擬一個昂貴的計算return 42;}public:Cache() : cacheValid(false), cachedValue(0) {} //成員初始化列表int getValue() const {if (!cacheValid) {cachedValue = expensiveCalculation(); // 更新緩存cacheValid = true;}return cachedValue;}
};
? ? ? ? (2)調試或統計
? ? ? ? 用于記錄函數調用次數等調試信息。
class Logger {
private:mutable int callCount;public:Logger() : callCount(0) {}void log() const {callCount++; // 記錄調用次數cout << "Log called " << callCount << " times" << endl;}
};
5.注意事項
? ? ? ? (1)不要濫用mutable,因為它會破壞常量成員函數的語義。只有在確實需要修改某些不影響對象邏輯狀態的變量時才使用。
? ? ? ? (2)mutable不能用于修飾靜態成員變量(static),因為靜態成員變量不屬于任何特定對象。
通過合理使用mutable,可以在保持常量成員函數語義的同時,靈活地處理一些特殊情況。
如有錯誤,敬請指正!!!