B j
A i = j
B は A から派生したものですが、私の質問は次のとおりです。どの c'tors が呼び出されますか? A のデフォルト c'tor と、A の operator= または A のコピー c'tor? ありがとう!
B j
A i = j
B は A から派生したものですが、私の質問は次のとおりです。どの c'tors が呼び出されますか? A のデフォルト c'tor と、A の operator= または A のコピー c'tor? ありがとう!
#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
コピー コンストラクターは、代入ではなく初期化であるためです。
標準 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) によって実装されます。