2012-07-22 18 views
31

は、以下のプログラムを考えてみましょうhttp://ideone.com/81XO6なぜコンストラクタは一度だけ呼び出されますか?私は出力を取得しています</p> <pre><code>class A { public: A(int i) { cout<<"Called"<<endl; } }; int main() { vector<A> v(5,A(1)); return 0; } </code></pre> <p>:

Called 

なぜコンストラクタは、我々は5つのオブジェクトを構築している場合でも、一度だけ呼び出されますか?
vectorはコンパイラによってどのように内部処理されていますか?

+7

その他はコピーコンストラクタによって初期化されます。 – jxh

+7

http://ideone.com/lHX5W –

+1

@Benjamin Lindley:あなたは答えにそれを書いてください – nico

答えて

39

クラスには2つのコンストラクタがあり、そのうちの1つだけを見ています。 std::vectorオリジナルを要素で作成します。そのために、クラスAのコピーコンストラクタは、あなたの例では5回呼び出されます。

例のAのコピーコンストラクタは暗黙的に宣言され、コンパイラによって定義されます。あなたが望むなら、宣言して自分で定義することができます。何かを印刷すると、少なくとも5回呼び出されます。

+0

リサイズがないと仮定すると、5倍か4倍か?元のコピーは使用されていますか? – Mysticial

+3

@Mysticial:コンパイラがオリジナルを直接使用できるとは思わない。どうやって?要素はダイナミックメモリブロックに格納され、元の要素が構築された後*に割り当てられます。したがって、5つの要素すべてをオリジナルからコピーする必要があります。 – AnT

+0

私はそれについて考えているので、それは間違った範囲にあるので正しいです。 – Mysticial

12

vector<A> v(5,A(1)); 

コンストラクタを呼び出すと、線が ベクトルv(5、X)となるので、それが一度呼び出さ。

ここで、Xはコンストラクタを呼び出した後に構築されるオブジェクトです。

その後、コピーコンストラクタが使用されます。これを確認するために、クラスの宣言に

A(const &A); 

を追加

してみてください。

関連する問題

 関連する問題