類靜態變數 問題

2022-08-09 08:51:11 字數 1085 閱讀 9931

類的靜態成員變數 

記憶體分配方式有三種:   

(1)從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。例如全域性變數,static變數。   

(2)在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令集中,效率很高,但是分配的記憶體容量有限。   

(3)從堆上分配,亦稱動態記憶體分配。程式在執行的時候用malloc或new申請任意多少的記憶體,程式設計師自己負責在何時用free或delete釋放記憶體。動態記憶體的生存期由我們決定,使用非常靈活,但問題也最多。  

類的靜態成員變數和函式中的靜態變數一樣,在編譯的時候就分配記憶體了,直到程式退出才釋放,並不是隨著物件的刪除而釋放的:

因為類的靜態成員變數是所有例項共用的.所以得在類外初始化.

呼叫的時候可以通過物件呼叫,也可以通過類直接呼叫

class a

;class b

;int b::n = 1;    //靜態成員變數的初始化

a b::aobj;       //靜態成員變數的初始化(例項化)

void main()

私有的靜態成員變數也是放在類外初始化的.這看起來跟它的私有屬性不相符.

再做下面的測試,發現了乙個有趣的現象.

class b

;    //把這行注釋掉,輸出變成0

int p();

};int b::i = 2;      //把這行注釋掉,編譯報錯

void main()

這樣看來.類外的初始化那一行根本沒有起到初始化的作用.它賦的值根本沒用.(對私有靜態成員變數是這樣.公有的還是有作用的)

於是我的理解是:

靜態成員變數的定義一共包括兩個部分.

像函式一樣,要先在類中宣告,然後再找個地方實現.靜態成員也要先在類中宣告了,再到類外"實現"一下.

只是私有的靜態成員在類外是不可訪問的.於是在類外的賦值語句將不起作用,只起到乙個"實現"的作用.

我的理解:私有的靜態成員變數在編譯 的時候就已經為其分配好記憶體了,並為其初始化,當用類定義物件的時候,就會呼叫類的建構函式重新給靜態成員變數賦值。

python類靜態變數

python的類靜態變數直接定義在類中即可,不需要修飾符,如 class test stc attr 1def init self,attr1,attr2 self.attr1 attr1 self.attr2 attr2 在類test中,stc attr是屬於類test的靜態變數,attr1和at...

C 靜態變數問題

今天實現乙個函式的時候第一思路就是靜態變數 eg templateint puttreeinarray gtnode t1,elem a 而這個函式的目的是將乙個普通樹的結點值放入陣列中,並返回結點數,而我將在下面乙個函式呼叫這個函式兩次。eg templatebool isequaltree gt...

靜態變數和非靜態變數

class string1 a和b編譯報錯,can not make a static referrence to no static filed s3,s4 分析 string s1 pingguo string s2 xiangjiao string s3 new string lizi str...