關於c 的靜態成員變數為什麼一定要初始化

2021-08-27 08:52:44 字數 581 閱讀 6363

我們知道c++類的靜態成員變數是需要初始化的,但為什麼要初始化呢。

其實這句話「靜態成員變數是需要初始化的」是有一定問題的,應該說「靜態成員變數需要定義」才是準確的,而不是初始化。

兩者的區別在於:初始化是賦乙個初始值,而定義是分配記憶體。

靜態成員變數在類中僅僅是宣告,沒有定義,所以要在類的外面定義,實際上是給靜態成員變數分配記憶體。

可以通過以下幾個例子更形象的說明這個問題:

#include class a ; 

int main()

編譯以上**會出現「對『a::a』未定義的引用」錯誤。這是因為靜態成員變數a未定義,也就是還沒有分配記憶體,顯然是不可以訪問的。

#include class a ; 

int a::a = 3; //定義了靜態成員變數,同時初始化。也可以寫"int a:a;",即不給初值,同樣可以通過編譯

int main()

這樣就對了,因為給a分配了記憶體,所以可以訪問靜態成員變數a了。

注意:在類外面  這樣子寫 :int a::a ; 也可以表示已經定義了。

**:

C 靜態成員變數為什麼在類外部定義?

c 中靜態成員變數要在類外部再定義,否則產生link2001錯誤.class testclass 類外部定義,若不寫會產生 error lnk2001 unresolved external symbol public static int testclass m i m i testclass 2...

HashMap底層為什麼一定用陣列

hashmap原始碼資料結構 entry table new entry capacity 其中,entry就是乙個鍊錶節點。如果將陣列替換成linkedlist是否可行?如下 listtable new linkedlist 將陣列替換成linkedlist是可以的,但是hashmap選用陣列的原...

HashMap底層為什麼一定用陣列

hashmap原始碼資料結構 entry table new entry capacity 其中,entry就是乙個鍊錶節點。如果將陣列替換成linkedlist是否可行?如下 listtable new linkedlist 將陣列替換成linkedlist是可以的,但是hashmap選用陣列的原...