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