2011-11-11 9 views
1

配列を宣言すると、すべての変数/オブジェクトが宣言されます。しかし、クラスにコンストラクタがある場合、オブジェクトはどうなりますか?私が使用しているクラスは、2つのコンストラクタを持っています - 1つは引数がなく、もう1つはいくつかの引数を持ちます。最初のコンストラクタは宣言の後で有効になりますか?または、コンストラクタが有効になりませんか?C++コンストラクタを持つオブジェクトを配列に追加する

最初の場合は、コンストラクタを置き換える関数を作成する必要があります。

したがって、新しく宣言された配列のオブジェクトはどうなりますか?

答えて

8

どのように配列を宣言するかによって異なります。メンバーは、デフォルト値、またはコピー初期化のいずれかになります:クラスタイプ、default-と値初期化のために

Foo x[] = { Foo(1), Foo(true, 'a'), Foo() }; // copy-initialize 
Foo x[3] = { };        // value-initialize 
Foo x[3];          // default-initialize 

デフォルトコンストラクタを呼び出します。コピー初期化は、適切なコンストラクタを直接呼び出すことができます。

デフォルト・コンストラクタを使用したくない場合は、ブレース初期化子arroundの取得および各メンバーを綴りません。

+0

あなたは意味はFooのx [] = {**新しい**はFoo(1)、...}? –

+0

@ThanhNguyen: 'フー(はFoo *)'コンストラクタを必要とし、そのコンストラクタは '(非常に悪いスタイルになります)その引数をDELETE'ていない場合は、メモリリークを引き起こすだろう。 –

+0

@ThanhNguyen:いいえ、私は 'Foo x [] = {Foo(1)};'を意味します。 'Foo x [] = {1};'と言うこともできますが、これは少し異なります.1つの引数のコンストラクタと暗黙のコピーコンストラクタが必要です。 C++ 11では、 'Foo x [] = {{true、 'a}};'も許可することで、これをより柔軟にすることができますが、ここでもアクセス可能な暗黙のコピーコンストラクタが必要です。 –

2

配列は、基になる型が単純ではないデフォルトのコンストラクタを持つ場合、すべてのオブジェクトのデフォルトのコンストラクタを呼び出します。

私は正確にルールを覚えていますが、int型、char型* sで、そのメンバーがすべてなど、ささいなコンストラクタを持っている、すべての些細なデフォルトコンストラクタを持って構造体ません。これらのものの配列(およびこれらの配列の配列など)は、明示的に指定しないかぎり、初期化されません。

明示的に宣言されたデフォルトコンストラクタは決して簡単ではないので、配列内のFooオブジェクトはデフォルトで構築されます。

+0

は、私はあなたが実際に初期化されていない変数を去る最後の段落、の基本的なタイプのデフォルトの初期化を参照していると思います。 –

+0

@KerrekSB:いいえ、基本的な種類だけではありません。構造体、共用体、構造体の配列の構造体などはすべて、簡単なデフォルトのコンストラクタを持つことができます。 –

+0

はい、確かに、これはそれらの物の構造体と配列に再帰的に適用されます! –

関連する問題