C 中關於全域性物件的初始化順序

2021-07-13 13:15:42 字數 2843 閱讀 8016

在stackoverflow上看到下面這樣乙個問題:

這個問題很簡單,意思就是兩個全域性不同類的instance,其中乙個依賴另乙個,怎麼確保他們的構造順序。也就是說o2依賴於o1,o2被例項化之前,我們要確保o1一定要被構造出來,或者說初始化。就上面來看,如果這樣兩個全域性變數o1和o2在同乙個編譯單元,說白了就是在同乙個cpp檔案裡,那麼編譯器會保證按照他們出現的順序初始化。但是如果這樣兩個全域性變數在不同的編譯單元呢,這時候情況比較複雜了,編譯器已經不能控制他們的構造順序了,我們需要自己想辦法確定他們的構造順序,因為編譯器不能定義不同編譯單元全域性變數的初始化順序。下面是我的sample code, 這兩個全域性變數分別在不同的編譯單元,請看**:

在o1之前被構造出來的,這個應該是編譯器隨機選擇的,我們不能確定o2和o1他們兩個之間的構造順序。

下面是一些辦法,確定o1在o2之前一定被構造出來,因為在很多實際應用中,一些全域性物件依賴於另一些全域性物件的,雖然我們盡可能要少用全域性變數,不過今天討論的問題跟這個無關。請看修改過的**:

很明顯,o2依賴於o1, 而o1也在o2之前被構造出來了。

總結:

1.我們要盡可能少用全域性變數

2.可以將乙個物件的建構函式作為另乙個物件建構函式的引數來保證他們的構造順序

c 中物件的初始化順序

在c 中乙個物件建立時按怎樣的順序初始化呢,下例 說明一切。using system class base public base class subclass base public subclass class classmembertype public classmembertype str...

c 物件初始化順序

c 物件初始化 1.先變數後建構函式。變數先被初始化 然後建構函式被執行 2.先靜態化後例項化。當乙個類被訪問時 靜態變數和建構函式最先被初始化 接著是物件的例項化變數和建構函式被初始化 3.先派生類後基類。對於變數和靜態建構函式 派生物件在基物件之前被初始化.比如 c類派生自b類 b類派生自a類 ...

C 物件的初始化順序

當構造乙個c 物件時,理解物件的字段和建構函式的順序是非常重要的 derived static fields 派生類靜態字段 derived static constructor 派生來靜態建構函式 derived instance fields 派生類例項字段 base static fields...