91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

對象在使用之前的初始化

發布時間:2020-07-20 12:07:05 來源:網絡 閱讀:286 作者:fun8888888 欄目:編程語言

 C++規定對象的初始化動作發生在進入構造函數主體之前。(初始化列表比在構造函數體內初始化的效率高,以為在函數體內初始化會調用默認的構造函數)

編譯單元是指產出單一目標文件的那些源碼。

問題:

   兩個源碼文件,每個文件中至少有一個non-local static對象(即該對象是全局的或者位于namespace作用域內,或在class內或file的作用域內被聲明為static)。如果某編譯單元內的non-local static對象的初始化用動作使用了另一個單元內的某個non-local static對象,在這個時候由于c++對定義在不同的編譯單元內的non-local static對象的初始化次序沒有明確的規定,所以用可能引發錯誤。

例子:

你寫的程序(一個編譯單元):

class FileSystem
{
 public:
     …
     size-tnumDisk() const;
     …
};
Extern FileSystem tfs;//
準備給別人用的對象


別人的程序(另一個編譯單元)

class Directory
{
  Directory(params)
{
   Size_tdisk=tfs.numDisks();   //使用第一個編譯單元的對象,假設在編譯這個文件之//前已經編譯了上一個文件那么沒錯,如果相反呢?
}
};


解決辦法:

   將每個non-local static對象搬到自己專屬的函數內(也就是在函數內聲明為static)。這些函數返回一個引用指向它所含的對象。在調用的時候調用這些函數而不是直接調用對象。理由(c++保證,函數內的local static對象會在該函數調用期間首次遇上該對象的定義式時被初始化)

程序修改之后:

class FileSystem
{
 public:
     …
     size-tnumDisk() const;
     …
};
FileSystem& tfs()
{  static FileSystem fs;
   returnfs;
}
 
 
Class Directory
{
  Directory(params)
{
       Size_tdisk=tfs().numDisks();   //調用函數tfs()
}
};
Directory& tempDir()
{
Static Directory td;
return td;
}

  任何一種non-conststatic對象不論他是local還是non-local,在多線程的環境下等待某事發生都會有麻煩,處理麻煩的做法是:在程序單線程啟動的階段手工調用引用返回的函數,這可以消除與初始化有關的競速形式。

總結:

   一、對內置類型進行手工初始化(c++不保證初始化他們)。

   二、構造函數最好使用成員初始列,而不要在構造函數內使用賦值操作,初始列的次序應該和class中的聲明次序相同。

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




向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

五原县| 盘山县| 柯坪县| 林芝县| 大化| 云南省| 涞水县| 绥德县| 灵川县| 佳木斯市| 库尔勒市| 南江县| 东阿县| 保亭| 上高县| 崇明县| 大邑县| 红安县| 淮安市| 区。| 鞍山市| 光泽县| 大足县| 呈贡县| 容城县| 孟村| 乌鲁木齐市| 沙洋县| 西平县| 孟津县| 陇川县| 三穗县| 萍乡市| 洪洞县| 荔波县| 仁化县| 邯郸县| 梓潼县| 开化县| 区。| 巴彦淖尔市|