天天看點

《C++程式設計慣用法——進階程式員常用方法和技巧》——2.9 靜态對象的構造

本節書摘來自異步社群出版社《c++程式設計慣用法——進階程式員常用方法和技巧》一書中的第2章,第2.9節,作者: 【美】robert b. murray ,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

我們也可以用構造函數來對那些有着static存儲類型的對象進行初始化:

c++編譯系統確定:所有的靜态對象在它們被使用之前都會被初始化。很多的編譯器實作的做法是将所有的靜态對象放到main函數被調用之前進行初始化,但c++語言規則中也允許我們在(動态的)連結時期用動态的連結器來初始化編譯單元中的所有對象。

對于在同一個編譯單元中出現的靜态對象,它們的初始化順序和它們在代碼中出現的順序是一緻的:

在上面的代碼中,我們可以確定default_name的初始化操作要早于default_src_file的初始化操作。在同一檔案中出現的靜态對象,它們的析構順序和它們的構造順序正好相反,是以default_src_file必須早于default_name被析構。

在不同檔案中的初始化操作的順序則是未定義的:

我們無法保證,default_name會早于default_src_file被建立。

對于上面的那個問題,我們并沒有一個簡單的解決方法。如果我們有着一個依賴于定義在其他檔案中的其他靜态對象的靜态對象(如default_src_file),我們就應該試着将這兩個對象放在同一個檔案中(這樣我們就可以得到它們的初始化的确切順序)。如果我們做不到這點,我們就不得不将這些初始化操作延遲到main函數被執行時才執行它們:

如果我們的代碼來自于一個函數庫,在那裡并沒有我們所期望的main函數,那麼我們還可以在每個使用了具有依賴關系的靜态對象的函數中對該對象進行檢測,看看它是否已經被初始化了:

繼續閱讀