類的靜態成員變數
記憶體分配方式有三種:
(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...