c 語言中類中的靜態資料成員為什麼必須在類體外初始化

時間 2021-07-04 07:40:13

1樓:du瓶邪

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

//test.cpp

#include

class a ;

int main()

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

再看如下例子:

//test.cpp

#include

class a ;

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

int main()

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

因為類中的靜態成員變數僅僅是宣告,暫時不需分配記憶體,所以我們甚至可以這樣寫**:

//a.cpp

class b; //這裡我們使用前置宣告,完全不知道b是什麼樣子

class a ;

使用命令"g++ -c -o a.o a.cpp"通過編譯。

對於類來說,new一個類物件不僅會分配記憶體,同時會呼叫建構函式進行初始化,所以類物件的定義和初始化總是關聯在一起。

2樓:匿名使用者

靜態成員屬於全域性變數,是所有例項化以後的物件所共享的,而成員的初始化你可以想象成向系統申請記憶體儲存資料的過程,顯然這種共有物件必須提前申請好,而不是由某個例項化的物件來操縱的。

3樓:匿名使用者

靜態成員本質上是全域性的,類的所有物件共享,不單屬於某個物件,不能放到建構函式中初始化,簡單一點,這種初始化方式你可以認為是c++的語法規定,死記硬背就行了

4樓:溪貝0號

因為 ,你在類中初始化,不一定能夠初始化得了。(為了確保能初始化,還是寫在外面)

你在類中初始化,無非就是放在建構函式裡面。 當我們用類定義物件的時候,肯定要呼叫建構函式,它也就順便初始化話了。

但是,你人算不如天算,若有人故意找事,偏不用類呼叫物件,而是通過 類名::靜態變數 的方式 訪問靜態變數,這時你就訪問到了一個未初始化的變數,這是編譯器所不允許的。

所以,由於類內不能完全初始化,所以還是類外初始化可靠,確保了初始化。

其實初始化雖然寫在類外,其實他是屬於類內的。

不然你初始化話私有的靜態變數就訪問不到,所以其實你說的類外,其實就是類內,只是寫在了類外而已。

c語言中的列舉型什麼意思,C語言中的列舉型別有什麼用麼?

樊德文字鳥 就是你宣告的這個列舉變數的值,只能取其中的東西,比如 enum weekday 那weekday這個變臉的值只能是 中的值。他們分別對應數字0,1,2,3,4,因為列舉型變數也是整型 就是你變數的值只能是你定義的列舉型中定義的數值。比如enum name 你name a的值只能為中的一個...

C語言中是如何掛接資料庫的,C 語言中是如何掛接資料庫的

system.data.sqlclient.sqlconnection scnn new system.data.sqlclient.sqlconnection server local database temp uid sa pwd 123 初始化資料庫連線物件 system.data.sqlc...

C語言中的printf sum d n ,sum 中的d n究竟是什麼意思啊

斐薄漢荷 雙引號中的是原樣輸出和輸出結果的格式也就是說這句話輸出的是sum sum的結果 sun 是原樣輸出 d是後邊那個sum的格式是整數 f是小數 c是字元 n是回車換行的意思 邶凌絲融輝 1.d 是轉換說明符 n是轉義字元 2.d通常用在printf函式和scanf函式中,d規定了輸入輸出項的...