8

次の方法でベクトルを初期化すると、次のようになります。

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

既定のコンストラクターを 1 回呼び出してから、コピー コンストラクターをさらに 10 回呼び出します。したがって、正しく理解すれば、ベクター内のオブジェクトはすべてコピー コンストラクターによって作成されます。

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

4

1 に答える 1

15

初期サイズを10に指定した場合を除いて、オブジェクトなしでメモリが割り当てられるため、10個のオブジェクトを作成する必要があります。実際にオブジェクトを作成せずに10個のオブジェクトのメモリが必要な場合は、次のようにすることができます。

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

使用しているコンストラクターの署名を見ると、次のようになっています。

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

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

他のことができることは間違いありませんが、単純さ(値を指定しない)、汎用性(必要に応じて値を指定する)、およびコードサイズ(ctor全体をデフォルトに複製することを避ける)の間の合理的なバランスを提供しますコンテンツを構築します)。

于 2012-09-08T19:58:39.577 に答える