《C++编程惯用法——高级程序员常用方法和技巧》——2.9 静态对象的构造
本節(jié)書摘來自異步社區(qū)出版社《C++編程慣用法——高級程序員常用方法和技巧》一書中的第2章,第2.9節(jié),作者: 【美】Robert B. Murray ,更多章節(jié)內(nèi)容可以訪問云棲社區(qū)“異步社區(qū)”公眾號查看。
2.9 靜態(tài)對象的構(gòu)造
我們也可以用構(gòu)造函數(shù)來對那些有著static存儲類型的對象進行初始化:
static String hello("Hello world");C++編譯系統(tǒng)確保:所有的靜態(tài)對象在它們被使用之前都會被初始化。很多的編譯器實現(xiàn)的做法是將所有的靜態(tài)對象放到main函數(shù)被調(diào)用之前進行初始化,但C++語言規(guī)則中也允許我們在(動態(tài)的)鏈接時期用動態(tài)的鏈接器來初始化編譯單元中的所有對象。
對于在同一個編譯單元中出現(xiàn)的靜態(tài)對象,它們的初始化順序和它們在代碼中出現(xiàn)的順序是一致的:
String dafault_name("foo");String default_src_file(default_name + ".c");在上面的代碼中,我們可以確保default_name的初始化操作要早于default_src_file的初始化操作。在同一文件中出現(xiàn)的靜態(tài)對象,它們的析構(gòu)順序和它們的構(gòu)造順序正好相反,因此default_src_file必須早于default_name被析構(gòu)。
在不同文件中的初始化操作的順序則是未定義的:
extern String default_name; String default_src_file(default_name +".c"); //Bug!我們無法保證,default_name會早于default_src_file被創(chuàng)建。
對于上面的那個問題,我們并沒有一個簡單的解決方法。如果我們有著一個依賴于定義在其他文件中的其他靜態(tài)對象的靜態(tài)對象(如default_src_file),我們就應(yīng)該試著將這兩個對象放在同一個文件中(這樣我們就可以得到它們的初始化的確切順序)。如果我們做不到這點,我們就不得不將這些初始化操作延遲到main函數(shù)被執(zhí)行時才執(zhí)行它們:
extern String default_name; String* default_src_file = 0;Static void init_names(){default_src_file = new String (default_name + ".c");//其他的初始化操作 }main() {init_names();如果我們的代碼來自于一個函數(shù)庫,在那里并沒有我們所期望的main函數(shù),那么我們還可以在每個使用了具有依賴關(guān)系的靜態(tài)對象的函數(shù)中對該對象進行檢測,看看它是否已經(jīng)被初始化了:
extern String default_name; String* default_src_fi1e = 0;void routine_that_uses_name(){if (default_src_file == 0)default_src_file = new String(default_name + ".C");//使用default_src_file 我```總結(jié)
以上是生活随笔為你收集整理的《C++编程惯用法——高级程序员常用方法和技巧》——2.9 静态对象的构造的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 巧用linux云服务器下的的/dev/s
- 下一篇: 《微信公众平台开发最佳实践》——第3章