2012-09-08 16 views
8

を呼び出してください:C++はなぜベクトルの初期化は、コピーコンストラクタ

std::vector<MyClass> MyVec(10); 

それは、一度デフォルトのコンストラクタを呼び出して、コピーコンストラクタに追加の10回を呼び出します。 それを正しく理解すれば、ベクトルのオブジェクトはすべてコピーコンストラクタによって作成されます。

誰かが、コピーコンストラクタを呼び出す理由を説明することはできますが、デフォルトのものは説明できませんか? オブジェクトを持たないメモリを割り当てるだけですか?

+0

オブジェクトを構築せずにメモリを割り当てる:実際には使用できません。代入演算子でさえ、コンストラクタが確立するものを必要とするかもしれません。もちろん予約だけでも意味をなさないかもしれませんが、セマンティクスは非常に異なるでしょう。 – delnan

+1

[My test](http://liveworkspace.org/code/b831cffa5df38a6b12c8a637de815573)には、10回呼び出されるデフォルトのコンストラクタが表示されます。 – chris

+1

この動作は、各メンバーの値の初期化が可能なC++ 11で変更されました。 –

答えて

15

初期サイズ10を指定したことを除いて、オブジェクトなしでメモリを割り当てますので、にはというオブジェクトが10個あります。あなたが実際にそれらを作成せずに10個のオブジェクトのメモリが必要な場合は、あなたが何かを行うことができます:あなたが使用しているコンストラクタの署名を見れば

std::vector<MyClass> MyVec; 
MyVec.reserve(10); 

は何かのように:みましょう

vector(size_t num, T initial_value = T()); 

あなたが作成するよう指示するスポットを埋めるために使用する価値を渡します。値を指定しない場合は、デフォルトのctorを使用してctorに渡す値を作成し、それをベクトル自体にコピーします。

でも可能ですが、シンプルさ(値を指定しないでください)、汎用性(必要に応じて値を指定します)、コードサイズコンテンツを作成するためには、デフォルトのctor全体が必要です)。

+0

実際に署名は '明示的ベクトル(size_type count)'なので、 "seed"のデフォルト値が内部に作成されます。 – Rost

+0

@Rost、見た目からは、C++ 11ではそれが変更されたようです。質問は技術的にはC++ 03の場合ですが、私は1分前に​​見つけました。 – chris

+1

C++ 03とC++ 11の問題です。 C++ 11では、 'vector(size_t count)'と 'vector(size_t count、T const)を持っています。値) 'を返します。違いに注目してください。 – Nawaz

関連する問題