再看static資料成員

2022-04-10 16:21:44 字數 849 閱讀 5920

當將類的某個資料成員宣告為static時,該靜態資料成員只能被定義一次,而且要被同類的所有物件共享。各個物件都擁有類中每乙個普通資料成員的副本,但靜態資料成員只有乙個例項存在,與定義了多少類物件無關。

靜態資料成員的用途之一是統計有多少個物件實際存在。

靜態資料成員不能在類中初始化,實際上類定義只是在描述物件的藍圖,在其中指定初值是不允許的。也不能在夠造函式中初始化該成員,因為靜態資料成員為類的各個物件共享,那麼每次建立乙個類的物件則靜態資料成員都要被重新初始化。

1 #include   2

3class

cdummy 4;

89int cdummy::n=9; //

這裡是定義加初始化

1011

void

main()

12

上面這樣完全沒問題,但是不能直接在類中初始化,比如: 

static   int   n=9; 

+++++++++++++++++++

為什麼static成員一定要在類外初始化? 

這是因為被static宣告的類靜態資料成員,其實體遠在main()函式開始之前就已經在全域性資料段中誕生了(見《inside   the   c++   object   model》page247)!其生命期和類物件是非同步的,(而且靜態語意說明即使沒有類實體的存在,其靜態資料成員的實體也是存的)這個時候物件的生命期還沒有開始,如果你要到類中去初始化類靜態資料成員,讓靜態資料成員的初始化依賴於類的實體,,那怎麼滿足前述靜態語意呢?難道類永遠不被例項化,我們就永遠不能訪問到被初始化的靜態資料成員嗎? 

所以我的朋友,為了滿足c++的static語意,static成員一定要在類外初始化!

static資料成員 static成員函式

類的static資料成員的引入 不同物件之間共享訪問,本質上是對該型別所有物件,只維持乙份拷貝。與全域性變數相比,優勢 1.靜態資料成員仍然是在類域名字空間,沒用進入程式的全域性名字空間,因此不存在與程式中其他全域性名字衝突的可能。2.可以實現資訊隱藏,靜態資料成員可以是private成員,全域性變...

static 成員變數以及static成員函式

靜態成員變數必須在類外實現初始化。靜態資料成員儲存在靜態儲存區,在程式整個執行期間都存在。sizeof 類名student sizeof 物件名s1 為不包含靜態資料成員的記憶體大小。常用來解決計數問題 include using namespace std class student static...

static成員和非static成員

1.靜態成員 1 所有的static方法不允許呼叫非static定義的屬性或方法,因為靜態函式成員屬於類的成員,例項成員變數是屬於某個物件的,而靜態方法在執行時,並不一定存在物件,但是靜態方法可以使用靜態變數 2 描述共享屬性,只需在屬性前新增static關鍵字即可,建立乙個類的多個例項,其stat...