2016-05-16 29 views
-1

std::vectorのように初期化すると、Aのデフォルトのコンストラクタが呼び出されないのはなぜですか?なぜstd :: vectorを初期化しないのですか<T> Tを初期化しますか?

std::vector<A> vec; //Doesn't call constructor 
vec.push_back(A(2)); //Calls constructor 

私はこれを理解していない、誰かが非常に詳細に説明できますか?

+1

'A'ではなく' std :: vector'を初期化しているので、呼び出されません。 – Rakete1111

+0

私はvがAではないことを知っていますが、ベクトルのタイプがAタイプの場合、どのようにベクトルvを作成するのですか?私の要点は、コンパイラがリソースをどのように割り当てるか、後で割り当てられるかどうかです。 – Adib

+1

Aのオブジェクトを作成せずにsizeof(A)でクラスのサイズを問い合わせることができれば、コンパイラはAの配列を構築しなくても割り当てることができます。 –

答えて

6

ベクトルvを構築すると、Aオブジェクトが含まれないため(コンストラクタを呼び出す必要はありません)。 vを設定すると、Aオブジェクトが明示的に構築され、これらのオブジェクトはベクトル内のメモリにコピーまたは移動されます。

Aオブジェクトはデフォルトで構築されていないので、デフォルトのコンストラクタは呼び出されません(= deleteとマークした場合、コードは正常にコンパイルされます)。あなたがvector<A>を作成するとき

+0

私は今理解しています。 – Adib

0

ライン:

std::vector<A> vec; 
std::vector

がMないAを初期化します。 Aのインスタンスは保持されますが、Aのインスタンスが作成されるように初期化されていません。

+0

私はあなたの今のポイントを理解しており、plzに投票します – Adib

0

、あなただけA要素の束を保持するのに十分なメモリと、基盤となるベクトルインフラストラクチャを初期化しますが、何のAはその時点で初期化されませんので、ノーctorのが呼ばれるようになっています。

(一時的)A(25)をプッシュバックすると、その一時的なctorから最初に作成された後、ベクター内部配列にコピー(または移動)され、破棄されます。

メッセージの出現の順序と時間について説明しています。

関連する問題