簡體   English   中英

C++ 中的默認初始化

[英]Default initialization in C++

今天早上我問自己一些事情,但我找不到合適的詞來“谷歌”它:

可以說我有:

struct Foo
{
  int bar;
};

struct Foo2
{
   int bar;
   Foo2() {}
};

struct Foo3
{
   int bar;
   Foo3() : bar(0) {}
};

現在,如果我默認實例化FooFoo2Foo3

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是內置類型, Foo1Foo2的默認初始化將是未定義的。 如果它是一個自定義類型,那么默認構造函數就會被調用,但這里不是這樣。

教訓:總是初始化你的變量。

對於 pod-types,默認初始化是零初始化。

所以:

Foo(): b() {}Foo(): b(0) {}相同

我找不到 C++ 標准的相應部分,但是如果您完全跳過初始化程序,那么 POD 類型不應該是默認初始化的(與非 POD 類型不同)。

因此,在您的情況下,只有第三個示例被正確初始化。

案例 3 是正確的方法,具有成員初始化列表。

前兩個都不會被正確初始化,因為你沒有給它們一個初始值(就像一個只定義的變量沒有初始化)。

暫無
暫無

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

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