簡體   English   中英

具有默認構造函數的對象的初始化列表

[英]Initializer list for objects with default constructor

將類成員變量放在初始化列表中不需要在初始化列表中是否有任何好處? 例:

class Foo
{
public:
  Foo() {}
};

class Bar
{
public:
  Bar() : _foo() {}

private:
  Foo _foo;
};

在這種情況下,編譯器是否會執行任何特殊操作?

在這種情況下,它沒有任何區別。

但這樣做很有用。
如果你有大量的成員,那么列表中有一些但不是所有成員會引起一些混亂。 此外,它還強調了初始化的順序(順序是由類中聲明的順序定義的,但是在較大的類中可視化此順序非常有用,其中並非所有成員變量都在彼此旁邊聲明)。

注意:如果在內部化程序列表中將它們放入錯誤的順序,這通常只是大多數編譯器的警告(除非您將警告編譯為錯誤(您應該這樣做))。

真正的危險在於具有POD成員和編譯器生成的構造函數的類。

class NewFoo
{
      int x;
      int y;
};
// Version 1:
class Bar1
{
     NewFoo  f;
};
// Version 2:
class Bar2
{
     NewFoo  f;
     public:
         Bar2()  // f not in list.
         {}
};
// Version 3:
class Bar3
{
     NewFoo  f;
     public:
         Bar3()
            : f()
         {}
};

int main()
{
     Bar1     b1a;           // x and y not  initialized.
     Bar1     b1b = Bar1();  // x and y zero initialized.
     Bar2     b2a;           // x and y not  initialized.
     Bar2     b2b = Bar2();  // x and y not  initialized.
     Bar3     b3a;           // x and y zero initialized.
     Bar3     b3b = Bar3();  // x and y zero initialized.
}

初始化列表是初始化構造函數中成員的首選方法。 這是初始化引用成員和常量成員的唯一可能方法。

此外,通過使用初始化列表,可以減少在初始化之前意外使用變量的可能性。 它是更大的哲學的一部分,在沒有初始化的情況下永遠不定義變量。

在正在使用的構造函數的初始化程序列表中未提及的成員是默認初始化的。 對於Foo這意味着將調用默認構造函數。

Bar() : _foo() { }之間的區別並沒有給Bar一個顯式的默認構造函數(或者說Bar() = default是你的版本沒有一個普通的默認構造函數。因此std::is_trivially_constructible<Bar>::value的值std::is_trivially_constructible<Bar>::value將與您完全離開構造函數不同,盡管行為在其他方面是相同的。

不,在這種情況下沒有什么不同。 我認為這樣做沒有任何好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM