C 裡靜態資料成員是在什麼時候被分配空間和初始化的?又是在什麼時候被析構或釋放的

2022-03-03 18:06:07 字數 2219 閱讀 6963

1樓:abc**隊

定義格式:

class 類名

;初始化格式:

型別名 類名::資料成員名[=初值]; //不加 static! 在靜態儲存區分配空間,只能定義一次。不設初值時,預設為0

使用:靜態資料成員是在靜態儲存區分配空間,具有靜態生命期,即存在於程式執行期間,直到程式執行結束,與物件的生、死無關。只能在類外定義。

推薦這樣的呼叫形式 : 類名::靜態資料成員

2樓:飯盒與玫瑰

靜態資料變數分配空間跟初始化不一樣,分配空間是指在程式執行開始時進行分配,並預設一個資料在記憶體空間中,如果以後沒初始化,則這個資料相當於初始化,程式結束是釋放,而初始化則是在你需要的時候進行初始化,當然你初始化的話記憶體空間中有一個資料.定義和宣告不一樣,函式宣告則是宣告有這麼一個函式,而定義則相當於給這個函式進行了個實體,假設一個人名叫王三,那麼王三這個名就是這個人的宣告,是一個抽象的,不是具體的某個事物,只是代表有一個叫王三得人,具體王三長什麼樣子,高矮,胖瘦,好壞,醜俊等都不知道,什麼是定義呢?則是王三這個人是定義,是一個實實在在的人,而不是一個抽象的名字,可以知道這個王三的高矮,胖瘦,好壞,醜俊等.

3樓:濱崎步最愛

主函式呼叫之前完成初始化

程式結束釋放

你可以寫一段程式,設定斷點除錯執行

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

4樓: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一個類物件不僅會分配記憶體,同時會呼叫建構函式進行初始化,所以類物件的定義和初始化總是關聯在一起。

5樓:匿名使用者

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

6樓:匿名使用者

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

7樓:溪貝0號

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

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

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

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

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

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

c++中 靜態資料成員除了初始化時要用作用域運算子還有什麼時候需要加呢?

8樓:種燒餅的怪叔叔

作用域符號的使用和靜不靜態沒有什麼必然的聯絡,只是為了說明變數所在的位置是在哪個作用域罷了。所有的成員變數,如果是私有的,除了 靜態成員必須在類外使用作用域符號初始化外,不能在類外使用私有成員。如果是公有的,在類外使用時要顯示的註明其所在作用域。

9樓:

使用這個成員的時候唄。

新曆在農曆裡是什麼時候

萬年曆公曆 新曆 1999年12月4日 星期六 農曆 十月廿七 己卯年 兔年 乙亥月 庚寅日 新曆1999年12月4日 農曆是10月27日 請問農曆1999年12月4日 對應的公曆是什麼時候?農曆1999年12月4日 對應的公曆是 2000年01月10日 對應干支是 己卯 丁丑 丁卯。陰曆1999年...

C 中endl到底在什麼時候必須用

endl 的作用是輸出換行並清空輸出緩衝區,相當於 flush n 所以當你需要及時向螢幕輸出資料的時候,就用 endl。知道作用就行了,沒要求必須用,endl可以換行,重新整理流,這樣在緩衝區裡的資料能及時輸出 怎麼會有這種問題啊?endl意思為end of line,就是說該行的結尾,到下一行了...

入黨宣誓是在什麼時候舉行,入黨宣誓什麼時候進行

新黨員入黨宣誓,應在支部大會通過並經過上級黨組織批准為預備黨員以後舉行,具體時間由各地黨支部自定,大多數單位的黨支部選擇每年的七一舉行入黨宣誓,上級黨組織應派人蔘加入黨宣誓儀式。新黨員入黨的宣誓詞是 我志願加入中國共產黨,擁護黨的綱領,遵守黨的章程,履行黨員義務,執行黨的決定,嚴守黨的紀律,保守黨的...