以下のサンプル コードを検討してください。
#include <iostream>
using namespace std;
class core
{
public:
core(const core& obj)
{
cout << "core copy ctor called\n";
}
core()
{
cout << "core default ctor called\n";
}
};
class sample : public core
{
public:
sample()
{
cout << "sample default ctor called\n";
}
#if 0
sample(const sample& obj)
{
cout << "sample copy ctor called\n";
}
#endif
};
int main()
{
sample s1;
sample s2 = s1; //Line1
return 0;
}
Type1: クラス sample に対して明示的に宣言されていないコピー コンストラクター
(上記のコードでは Type1 が示されています。次に、クラス sample のコピー コンストラクターがコンパイラによって暗黙的に生成されます)。ステートメントLine1
が実行されると、最初に のコピー コンストラクターclass core
が呼び出され、次に のコピー コンストラクターclass sample
が呼び出されます。
Type2: クラス sample に対して明示的に定義されたコピー コンストラクター
ステートメントLine1
が実行されると、最初に のデフォルト コンストラクターclass core
が呼び出され、次に のコピー コンストラクターclass sample
が呼び出されます。
質問:
Type1 と Type2 で述べたように、コピー コンストラクターの動作にこの違いがあるのはなぜですか?