靜態成員
類可以包含靜態成員數據和成員函數。當數據成員被聲明為“靜態”時,只會為類的所有對象保留一個數據副本。
靜態數據成員不是給定的類類型的對象的一部分。因此,靜態數據成員的聲明不被視為一個定義。在類范圍中聲明數據成員,但在文件范圍內執行定義。這些靜態類成員具有外部鏈接。下面的示例闡釋了這一點:
// static_data_members.cppclass BufferedOutput{public: // Return number of bytes written by any object of this class. short BytesWritten() { return bytecount; } // Reset the counter. static void ResetCount() { bytecount = 0; } // Static member declaration. static long bytecount;};// Define bytecount in file scope.long BufferedOutput::bytecount;int main(){}
在前面的代碼中,該成員 bytecount 在類 BufferedOutput 中聲明,但它必須在類聲明的外部定義。
在不引用類類型的對象的情況下,可以引用靜態數據成員。可以獲取使用 BufferedOutput 對象編寫的字節數,如下所示:
long nBytes = BufferedOutput::bytecount;
對于存在的靜態成員,類類型的所有對象的存在則沒有必要。還可以使用成員選擇(. 和 –>)運算符訪問靜態成員。例如:
BufferedOutput Console;long nBytes = Console.bytecount;
在前面的示例中,不會評估對對象(Console) 的引用;返回的值是靜態對象 bytecount 的值。
靜態數據成員遵循類成員訪問規則,因此只允許類成員函數和友元擁有對靜態數據成員的私有訪問權限。
可變數據成員
此關鍵字只能應用于類的非靜態和非常量數據成員。如果某個數據成員被聲明為 mutable,則從 const 成員函數為此數據成員賦值是合法的。
語法
mutable member-variable-declaration;
備注
例如,以下代碼在編譯時不會出錯,因為 m_accessCount 已聲明為 mutable,因此可以由 GetFlag 修改,即使 GetFlag 是常量成員函數。
// mutable.cppclass X{public: bool GetFlag() const { m_accessCount++; return m_flag; }private: bool m_flag; mutable int m_accessCount;};int main(){}