2017-05-11 14 views
1

は、私は次のように設定C++クラスがあるとします。オブジェクトのC++メンバ配列のデフォルト初期化?

class Foo{ 
    public: 
    struct Pair{ 
     int x; 
     int y; 
     Pair(){ x = 2; y = 4; } 
    }; 

    private: 
    Pair pairArr[16]; 
} 

そうpairArrを初期化せずに、その内部のペアの構造体のデフォルト値は何ですか? C++は(x = 2、y = 4で初期化する)コンストラクタを呼び出すか、まだ作成されていないオブジェクトですか?インデックスを自分で初期化するまで、私に "迷惑な"オブジェクトの配列を残していますか?

プリミティブデータ型の配列であれば、デフォルトで初期化されています(int型の配列を持つ場合はすべて0になります)。しかし、私の構造体のようなもっと複雑なオブジェクトの場合、この動作が成立するかどうかはわかりません。

+0

実際には、コンストラクタで*初期化子リスト*を使用することを学ぶべきです。ここではそれほど大きな違いはありませんが、メンバーのタイプに応じてctor本体を使用するのと比べて実際のパフォーマンスに影響を与えることができます。 –

+3

"原子型の配列であるかどうかはわかっていますが、デフォルトで初期化されています" - あなたは間違っていることを知っています。また、「原子型」の概念はどこで手に入れましたか? –

+0

あなたの配列のオブジェクトは*デフォルトで初期化されます*。あなたのクラスは(ユーザ定義のコンストラクタのため)集約型ではないので、デフォルトのコンストラクタは配列 – WhiZTiM

答えて

4

クラスと構造体はで同等ですが、アクセスの指定子のデフォルト値はです。だから、Arrays and Classesを確認し、これは言う:

通常の配列の宣言のスタイルは、配列内の各オブジェクトに対してデフォルトのコンストラクタを使用して実用的な観点から


(クラスは、デフォルトコンストラクタを持っている場合)

Pair() : x(2), y(4) { std::cout << "Called\n"; } 

と表示され、メッセージが16回印刷されて表示されます。

何が呼び出されているか(通常はその順序)を知りたいときは、これは通常の方法です(デストラクタにコンストラクタにプリントメッセージを追加する)。


ヒント:コンストラクタの本体内に値を割り当てるのではなく、イニシャライザリストを使用してください。

+3

ctor bodyの代入の代わりにメンバーの初期化を使用することをお勧めします。 – Slava

+0

@Slavaが更新されました。 – gsamaras