[英]Default initialization in C++
今天早上我問自己一些事情,但我找不到合適的詞來“谷歌”它:
可以說我有:
struct Foo
{
int bar;
};
struct Foo2
{
int bar;
Foo2() {}
};
struct Foo3
{
int bar;
Foo3() : bar(0) {}
};
現在,如果我默認實例化Foo
、 Foo2
和Foo3
:
Foo foo;
Foo2 foo2;
Foo3 foo3;
在哪種情況下, bar
成員正確初始化?
(好吧Foo3
顯然明確地初始化了它,這里只顯示了與Foo2
的區別,所以問題主要是關於前兩個。)
謝謝: :)
只有 foo3 將在所有上下文中。 如果 foo2 和 foo 的持續時間為 static,則它們將是。 請注意,Foo 類型的對象在其他上下文中可能初始化為零:
Foo* foo = new Foo(); // will initialize bar to 0
Foo* foox = new Foo; // will not initialize bar to 0
而 Foo2 不會:
Foo2* foo = new Foo2(); // will not initialize bar to 0
Foo2* foox = new Foo2; // will not initialize bar to 0
這個領域很棘手,C++98 和 C++03 之間的措辭發生了變化,IIRC 又是 C++0X,所以我不依賴它。
和
struct Foo4
{
int bar;
Foo4() : bar() {}
};
bar 也將始終被初始化。
由於bar
是內置類型, Foo1
和Foo2
的默認初始化將是未定義的。 如果它是一個自定義類型,那么默認構造函數就會被調用,但這里不是這樣。
教訓:總是初始化你的變量。
對於 pod-types,默認初始化是零初始化。
所以:
Foo(): b() {}
與Foo(): b(0) {}
相同
我找不到 C++ 標准的相應部分,但是如果您完全跳過初始化程序,那么 POD 類型不應該是默認初始化的(與非 POD 類型不同)。
因此,在您的情況下,只有第三個示例被正確初始化。
案例 3 是正確的方法,具有成員初始化列表。
前兩個都不會被正確初始化,因為你沒有給它們一個初始值(就像一個只定義的變量沒有初始化)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.