我們知道c++類的靜態成員變數是需要初始化的,但為什麼要初始化呢。
其實這句話「靜態成員變數是需要初始化的」是有一定問題的,應該說「靜態成員變數需要定義」才是準確的,而不是初始化。
兩者的區別在於:初始化是賦乙個初始值,而定義是分配記憶體。
靜態成員變數在類中僅僅是宣告,沒有定義,所以要在類的外面定義,實際上是給靜態成員變數分配記憶體。
可以通過以下幾個例子更形象的說明這個問題:
#include
class a ;
intmain
()
編譯以上**會出現「對『a::a』未定義的引用」錯誤。這是因為靜態成員變數a未定義,也就是還沒有分配記憶體,顯然是不可以訪問的。
再看如下例子:
#include
class a ;
int a::a = 3; //定義了靜態成員變數,同時初始化。也可以寫"int a:a;",即不給初值,同樣可以通過編譯
intmain
()
這樣就對了,因為給a分配了記憶體,所以可以訪問靜態成員變數a了。
因為類中的靜態成員變數僅僅是宣告,暫時不需分配記憶體,所以我們甚至可以這樣寫**:
class
b; //這裡我們使用前置宣告,完全不知道b是什麼樣子
class
a ;
使用命令"g++ -c -o a.o a.cpp"通過編譯。
對於類來說,new乙個類物件不僅會分配記憶體,同時會呼叫建構函式進行初始化,所以類物件的定義和初始化總是關聯在一起。
C 類的靜態資料為什麼一定要初始化
我們知道c 類的靜態成員變數是需要初始化的,但為什麼要初始化呢。其實這句話 靜態成員變數是需要初始化的 是有一定問題的,應該說 靜態成員變數需要定義 才是準確的,而不是初始化。兩者的區別在於 初始化是賦乙個初始值,而定義是分配記憶體。靜態成員變數在類中僅僅是宣告,沒有定義,所以要在類的外面定義,實際...
關於c 的靜態成員變數為什麼一定要初始化
我們知道c 類的靜態成員變數是需要初始化的,但為什麼要初始化呢。其實這句話 靜態成員變數是需要初始化的 是有一定問題的,應該說 靜態成員變數需要定義 才是準確的,而不是初始化。兩者的區別在於 初始化是賦乙個初始值,而定義是分配記憶體。靜態成員變數在類中僅僅是宣告,沒有定義,所以要在類的外面定義,實際...
Docker 為什麼一定要sudo
這個sudo真是煩死人了,每次都要sudosudo,覺得浪費了我大量的時間。但是,當我學習到如何到如何可以不sudo 為什麼要sudo之後,還是覺得sudo好一些吧,於是最後選擇加乙個環境變數,來節約時間。參考文章中給出了幾個非常高水平的處理辦法,我很喜歡,以後來學。1.如何免sudo實現docke...