-4
B j
A i = j

B は A から派生したものですが、私の質問は次のとおりです。どの c'tors が呼び出されますか? A のデフォルト c'tor と、A の operator= または A のコピー c'tor? ありがとう!

4

2 に答える 2

1
#include <iostream>

using namespace std;

class A
{

public:

    A()
    {
        cout << "(A) default constructor"<< endl;
    }

    A(const A& a)
    {
        cout << "(A) copy constructor" << endl;
    }

    A& operator=(const A& a)
    {
        cout << "(A) operator=" << endl;
    }

};

class B : public A
{

public:

    B()
    {
        cout << "(B) default constructor" << endl;
    }


};

int main()
{

    A a1;
    A a2 = a1;
    A a3(a1);

    cout<<"*******"<<endl;

    B b1;

    cout<<"*******"<<endl;

    B b4;
    A a4 = b4;

    return 0;
}

--output:--
(A) default constructor
(A) copy constructor
(A) copy constructor
*******
(A) default constructor
(B) default constructor
*******
(A) default constructor
(B) default constructor
(A) copy constructor
于 2013-06-07T13:22:58.540 に答える
1

コピー コンストラクターは、代入ではなく初期化であるためです。

標準 C++98 12.8 [class.copy] p1 から:

クラス オブジェクトは、関数の引数の受け渡し (5.2.2) と関数値の戻り (6.6.3) を含む初期化 (12.1、8.5) と代入 (5.17) の 2 つの方法でコピーできます。概念的には、これら 2 つの操作は、コピー コンストラクター (12.1) とコピー代入演算子 (13.5.3) によって実装されます。

ここでは編集が少し曖昧に見えます。C ++ 11のリダクションの方が良いかもしれません(セミコロンに注意してください):

クラス オブジェクトは 2 つの方法でコピーまたは移動できます。関数の引数の受け渡し (5.2.2) および関数値の戻り (6.6.3) を含む、初期化 (12.1、8.5) によるものです。そして代入によって(5.17)。概念的には、これら 2 つの操作は、コピー/移動コンストラクター (12.1) とコピー/移動代入演算子 (13.5.3) によって実装されます。

于 2013-06-07T12:54:24.373 に答える