真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

對(duì)象在使用之前的初始化

 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)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站制作。焦作網(wǎng)站建設(shè)公司,為焦作等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站設(shè)計(jì),專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

編譯單元是指產(chǎn)出單一目標(biāo)文件的那些源碼。

問題:

   兩個(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ì)象的初始化次序沒有明確的規(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è)文件那么沒錯(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中的聲明次序相同。

   三、為免除跨編譯單元的初始化問題,應(yīng)該用local static對(duì)象替換non-local static對(duì)象。



分享標(biāo)題:對(duì)象在使用之前的初始化
本文路徑:http://weahome.cn/article/gejjjd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部