2011-11-20 58 views
5

このanswerのC++ 03では、()が省略された場合、PODタイプはデフォルトで初期化されます。それ以外の場合は、値が初期化されます。デフォルト初期化と値の初期化

// POD type 
struct foo { 
    int x; 
}; 

// value-initialized 
new foo(); 

しかし、ユーザー定義のコンストラクタが用意されている場合、下記のいずれかのオブジェクトは、デフォルトまたは値初期化とみなされますでしょうか?

// non-POD type 
struct bar { 
    bar(int x = 0):x(x) {} 
    int x; 
}; 

new bar(); 
new bar(42); 
+1

あなたの例では、 'bar'のコンストラクタを呼び出すと、' x'の初期化時に値が返されます。 – Chad

答えて

2

あなたのクラスにはコンストラクタが呼び出されることをデフォルトと値の両方の初期化の原因、ユーザー定義のデフォルトコンストラクタを持っている場合。次に起こるものは何でもコンストラクタ次第です:クラスUDTのオブジェクトの

struct UDT 
{ 
    int a; 
    int b; 
    Foo c; 
    Foo d; 
    UDT() : a(), c() {} 
}; 

両方ともデフォルト値の初期化は、初期化子リストがそう言うのでUDT::aUDT::cは、(そうaがゼロ)の値に初期化することになりますUDT::bUDT::dはデフォルトで初期化されます(bは初期化されていません。dは同じロジックを再帰的に適用します)。

初期化の詳細については8.5を、初期化子リストについては12.6.2(特に8項)を参照してください。

3

C++ 03では、()が省略された場合はPOD型が初期化され、それ以外の場合は値が初期化されます。

これはまったく起こりません。 C++ 03仕様のセクション8.5/9によれば、非静的PODタイプのオブジェクトにイニシャライザが指定されていない場合、そのオブジェクトとそのサブオブジェクトは「不確定な初期値を持つ」。つまり、ではなく、はデフォルトの初期化と同じことです。デフォルトの初期化はPODタイプの値初期化と同じですが、これはオブジェクトがゼロ初期化(8.5/5)されていることを意味しますが、空の初期化子(空の括弧8.5/7あたり)。したがって、空のイニシャライザを使用してPOD型のデフォルトおよび/または値の初期化のみを行うことができます。初期化子が指定されていない場合、非静的PODタイプのデフォルト初期化は行われません。

2番目の例では、ユーザー定義のコンストラクタを持つ非POD型で、value-initializer(括弧)記号を省略すると、技術的にdefault-initializationが実行されます。言い換えれば、ユーザー定義のコンストラクタ、デフォルトの初期化や値の初期化がある場合

bar* ptr_a = new bar; //default initialization 
bar* ptr_b = new bar(); //value initialization 

、8.5/5ごとに、非POD構造体やクラス・タイプの両方でそのかかわらず、心の中で両方のコールをしてくださいユーザー定義コンストラクタだから、最後に、タイプbarで宣言したように、デフォルトと値の初期化は同じことをやります。