2

次のコードがあります [これはインタビューの質問です]:

#include <iostream>
#include <vector>

using namespace std;

class A{
public:
    A(){
        cout << endl << "base default";
    }
    A(const A& a){
        cout << endl << "base copy ctor";
    }
    A(int) { 
        cout << endl << "base promotion ctor";
    }
};

class B : public A{
public:
    B(){
         cout << endl << "derived default";
    }
    B(const B& b){
         cout << endl << "derived copy ctor";
    }
    B(int) {
         cout << endl << "derived promotion ctor";
    }
};

int main(){

    vector<A> cont;
    cont.push_back(A(1));
    cont.push_back(B(1));
    cont.push_back(A(2));

        return 0;
    }

出力は次のとおりです。

base promotion ctor
base copy ctor
base default
derived promotion ctor
base copy ctor
base copy ctor
base promotion ctor
base copy ctor
base copy ctor
base copy ctor

この出力を理解するのに苦労しています。具体的には、基本デフォルトが一度呼び出され、最後の 3 つのコピー ctor が呼び出される理由です。誰かがこの出力を説明してもらえますか?

ありがとう。

4

1 に答える 1

4

基本のデフォルト コンストラクターは、行から 1 回呼び出されます。

cont.push_back(B(1));  

すべてのBコンストラクターは、既定のコンストラクターを呼び出しますA。最後の 2 つのコピー コンストラクターは、ベクターの再割り当てによるものです。たとえば、追加した場合

cont.reserve(3);

sの前にpush_back、彼らは去ります。

A(2)その前のものは、 finalの一時的なコピーですpush_back

于 2012-09-16T20:26:11.130 に答える