關於C 全域性變數和靜態變數初始化的一些總結

2021-08-17 10:23:11 字數 867 閱讀 4043

1.全域性變數

全域性變數無疑要在main函式開始前執行完成,但可細分為在編譯時和在執行時初始化,即static initialization和dynamic initialization。

static initialization

靜態初始化按照我的理解,是針對那些較為簡單的,c++內部定義的資料結構,如int,double,bool及其陣列結構的初始化。又可分為zero和const兩種方式。

對於zero初始化,編譯時編譯器將其分配在.bss段,不占用rom空間;而const初始化,也就是我們指定了全域性變數的初始值,編譯器會將其分配在.data段,占用room空間。

dynamic initialization

這種初始化針對的是需要呼叫建構函式才能完成的初始化。這種初始化會在main函式執行前由執行時庫呼叫對應的**進行初始化。

靜態初始化先於動態初始化,這一點很好理解。靜態初始化在編譯時初始化,直接寫進.bss和.data段,程式執行時直接載入,而動態初始化只能在執行時由執行時庫呼叫相應建構函式進行初始化。

2.類的靜態成員

c++規定,const的靜態成員可以直接在類內初始化,而非const的靜態成員需要在類外宣告以初始化。對於後一種情況,我們一般選擇在類的實現檔案中初始化。

至此,具體的初始化方式和上面所說的又是一致的,可在編譯期間初始化,也可以在執行時初始化。

3.關於靜態成員函式和靜態成員變數的使用

兩者都可以通過類名+"::"的方式進行使用,此外,對於類的物件,指標或引用,也可以直接呼叫。但類的靜態成員函式由於不含有this指標,只能引用其類的靜態成員變數。

不過有一種技巧,可以給類的靜態成員函式傳遞該類的指標、引用等作為形參,強行使用該類的物件。

全域性變數和靜態變數

變數可以分為全域性變數 靜態全域性變數 靜態區域性變數和區域性變數 按儲存區域分 全域性變數 靜態全域性變數和靜態區域性變數都存放在記憶體的全域性資料區,區域性變數存放在記憶體的棧區 按作用域分 全域性變數在整個工程檔案內都有效 靜態全域性變數只在定義它的檔案內有效 靜態區域性變數只在定義它的函式內...

全域性變數和靜態變數

如果定義乙個全域性變數,未被初始化,則變數被預設初始化,但區域性變數未被初始化,則該值未定義。內建型別和陣列一樣 定義全域性靜態變數 在全域性變數前加個關鍵字static,該全域性變數變為全域性靜態變數。全域性靜態變數有以下特點 1 在全域性資料區內分配記憶體 2 如果沒有初始化,其預設值為0 3 ...

全域性變數和靜態變數區別

儲存的地方是一樣的,不同之處在於它們的作用域不同 全域性變數基本上在程式的任何地方都能被看到 而靜態區域性變數只能在其指定的範圍內被使用 比如 int i 全域性變數 class c void main 全域性變數具有外部連線性,即同一工程中其它檔案中的也可引用。而靜態變數不具有外部連線性,即同一工...