詳解C++編程中的靜態(tài)成員與可變數據成員
靜態(tài)成員
類可以包含靜態(tài)成員數據和成員函數。當數據成員被聲明為“靜態(tài)”時,只會為類的所有對象保留一個數據副本。
靜態(tài)數據成員不是給定的類類型的對象的一部分。因此,靜態(tài)數據成員的聲明不被視為一個定義。在類范圍中聲明數據成員,但在文件范圍內執(zhí)行定義。這些靜態(tài)類成員具有外部鏈接。下面的示例闡釋了這一點:
// static_data_members.cpp class 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 中聲明,但它必須在類聲明的外部定義。
在不引用類類型的對象的情況下,可以引用靜態(tài)數據成員??梢垣@取使用 BufferedOutput 對象編寫的字節(jié)數,如下所示:
long nBytes = BufferedOutput::bytecount;
對于存在的靜態(tài)成員,類類型的所有對象的存在則沒有必要。還可以使用成員選擇(. 和 –>)運算符訪問靜態(tài)成員。例如:
BufferedOutput Console; long nBytes = Console.bytecount;
在前面的示例中,不會評估對對象(Console) 的引用;返回的值是靜態(tài)對象 bytecount 的值。
靜態(tài)數據成員遵循類成員訪問規(guī)則,因此只允許類成員函數和友元擁有對靜態(tài)數據成員的私有訪問權限。
可變數據成員
此關鍵字只能應用于類的非靜態(tài)和非常量數據成員。如果某個數據成員被聲明為 mutable,則從 const 成員函數為此數據成員賦值是合法的。
語法
mutable member-variable-declaration;
備注
例如,以下代碼在編譯時不會出錯,因為 m_accessCount 已聲明為 mutable,因此可以由 GetFlag 修改,即使 GetFlag 是常量成員函數。
// mutable.cpp class X { public: bool GetFlag() const { m_accessCount++; return m_flag; } private: bool m_flag; mutable int m_accessCount; }; int main() { }
相關文章
Win10中VC2013安裝Unit test組件出現問題解決方案
本文給大家分享的是個人在Win10中VC2013安裝Unit test組件出現問題并最終找到解決辦法的過程,有需要的小伙伴可以參考下2016-03-03