[英]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.