2017-12-20 18 views
6

私は任意の値に対して少なくとも1人のメンバーを初期化する際に他の全てをゼロに初期化されていることを理解し、私がしなければゼロに、アレイのすべてのメンバーを初期化したい、またはnullptrC++でC配列を初期化するこれらの方法に違いはありますか?

struct Window{ int a;}; 


int main() 
{ 
    Window* list[4] = { 0, 0, 0, 0 }; 
    Window* list2[4] = {0}; 
    Window* list3[4] = {}; 
    Window* list4[4]{ 0, 0, 0, 0 }; 
    Window* list5[4]{0}; 
    Window* list6[4]{}; 
} 

int list[4] = { 6 }; 

最初のメンバーは6になり、残りはすべてゼロで初期化されます。しかし私は、と混乱しています:

int list[4]{0}; 

int list[4]{}; 

私は初期化をデフォルトに対立するものとしてのない宣言は等号の直後に空波括弧は、ゼロ初期化を何と呼ばれていますされていることを前提としていますが、 int list[4]{0}もそうですね。これは舞台裏で std::initializer_listを含むかどうか?私はこれらがPOD以外のタイプにしか使われないと思ったので、 std::initializer_listはここで使用されていませんか?

+1

これらはすべて[集​​約初期化](http://en.cppreference.com/w/cpp/language/aggregate_initialization)の異なる形式で、最終的な効果は同じです。 – Praetorian

+2

私は[this site](http://en.cppreference.com/w/cpp/language/value_initialization)を愛しています。[initializers](http://en.cppreference.com/w/cpp/言語/リスト初期化)。 – lakeweb

+0

@lakewebありがとう。ああ、C++ 03とC++ 11の違いは、非常に微妙なことです。 – Zebrafish

答えて

3

C++でC配列を初期化する方法には違いがありますか?

いいえ意味的には同等です。

デフォルトの初期化とは対照的にゼロ初期化ですが、int list [4] {0}ではありませんか?

最初の要素はゼロでコピー初期化されます。残りの要素は値が初期化されており、intは実際にゼロ初期化です。具体的にはintの場合には、値、ゼロおよびコピー初期化には効果的な差はありません。その場合の区別は構文的です。

std :: initializer_listの後ろにシーンが含まれているかどうか

std::initializer_listは含まれていません。

0

それはCの代わりに:)

使用コンテナをスタイルすぎだ、C++での配列を格納するために、ポインタを使用しないでください。私はいつも汎用目的のオブジェクトの配列を作るためにvectorに固執します。ベクトルの初期化はクラスコンストラクタの後に行われます。あなたのWindowクラスをちょっと修正しましょう。

struct Window { 
    // Class constructor 
    Window(const int _a_) { 
     a = _a_; 
    } 

    // Class member 
    int a; 
}; 

std::vector<Window> windows (4, Window(0)); 

あなたの窓はaのゼロ初期化された値で4 Windowが含まれています。あなたの質問に答えてほしい。

+0

私は、OPがコンテナを十分に認識していることはかなり確信しています。彼の質問は、特定の言語構成の違いについてです。 – dasblinkenlight

+0

ああ、それは私の悪いです。私は結論として、これを読んだだけで、配列のすべてのメンバーをゼロに初期化したいと思った。 –

関連する問題