關於C 類的靜態資料為什麼一定要初始化

2021-07-12 01:21:24 字數 855 閱讀 8454

我們知道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...