C++規(guī)定對(duì)象的初始化動(dòng)作發(fā)生在進(jìn)入構(gòu)造函數(shù)主體之前。(初始化列表比在構(gòu)造函數(shù)體內(nèi)初始化的效率高,以為在函數(shù)體內(nèi)初始化會(huì)調(diào)用默認(rèn)的構(gòu)造函數(shù))
創(chuàng)新互聯(lián)建站-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比泰安網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式泰安網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋泰安地區(qū)。費(fèi)用合理售后完善,10多年實(shí)體公司更值得信賴。編譯單元是指產(chǎn)出單一目標(biāo)文件的那些源碼。
問(wèn)題:
兩個(gè)源碼文件,每個(gè)文件中至少有一個(gè)non-local static對(duì)象(即該對(duì)象是全局的或者位于namespace作用域內(nèi),或在class內(nèi)或file的作用域內(nèi)被聲明為static)。如果某編譯單元內(nèi)的non-local static對(duì)象的初始化用動(dòng)作使用了另一個(gè)單元內(nèi)的某個(gè)non-local static對(duì)象,在這個(gè)時(shí)候由于c++對(duì)定義在不同的編譯單元內(nèi)的non-local static對(duì)象的初始化次序沒(méi)有明確的規(guī)定,所以用可能引發(fā)錯(cuò)誤。
例子:
你寫的程序(一個(gè)編譯單元):
class FileSystem { public: … size-tnumDisk() const; … };
Extern FileSystem tfs;// 準(zhǔn)備給別人用的對(duì)象
別人的程序(另一個(gè)編譯單元)
class Directory { Directory(params) { Size_tdisk=tfs.numDisks(); //使用第一個(gè)編譯單元的對(duì)象,假設(shè)在編譯這個(gè)文件之//前已經(jīng)編譯了上一個(gè)文件那么沒(méi)錯(cuò),如果相反呢? } };
解決辦法:
將每個(gè)non-local static對(duì)象搬到自己專屬的函數(shù)內(nèi)(也就是在函數(shù)內(nèi)聲明為static)。這些函數(shù)返回一個(gè)引用指向它所含的對(duì)象。在調(diào)用的時(shí)候調(diào)用這些函數(shù)而不是直接調(diào)用對(duì)象。理由(c++保證,函數(shù)內(nèi)的local static對(duì)象會(huì)在該函數(shù)調(diào)用期間首次遇上該對(duì)象的定義式時(shí)被初始化)
程序修改之后:
class FileSystem { public: … size-tnumDisk() const; … }; FileSystem& tfs() { static FileSystem fs; returnfs; } Class Directory { Directory(params) { Size_tdisk=tfs().numDisks(); //調(diào)用函數(shù)tfs() } }; Directory& tempDir() { Static Directory td; return td; }
任何一種non-conststatic對(duì)象不論他是local還是non-local,在多線程的環(huán)境下等待某事發(fā)生都會(huì)有麻煩,處理麻煩的做法是:在程序單線程啟動(dòng)的階段手工調(diào)用引用返回的函數(shù),這可以消除與初始化有關(guān)的競(jìng)速形式。
總結(jié):
一、對(duì)內(nèi)置類型進(jìn)行手工初始化(c++不保證初始化他們)。
二、構(gòu)造函數(shù)最好使用成員初始列,而不要在構(gòu)造函數(shù)內(nèi)使用賦值操作,初始列的次序應(yīng)該和class中的聲明次序相同。
三、為免除跨編譯單元的初始化問(wèn)題,應(yīng)該用local static對(duì)象替換non-local static對(duì)象。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。