2

以下のサンプル コードを検討してください。

#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 で述べたように、コピー コンストラクターの動作にこの違いがあるのはなぜですか?

4

1 に答える 1

7

明示的に定義したコピー コンストラクターは、のコピー コンストラクターの呼び出しをsample要求しないためです。それを実現したい場合coreは、書く必要があります。: core(obj)

別の言い方をすれば、明示的なコピー コンストラクターを作成するとsample、そのcoreサブオブジェクトを含む のコピー構築を担当することになります。あなたが行った方法でそれを書くことによって、あなたはcoreを使用してサブオブジェクトを初期化しないことを選択しobjました。どのように初期化するかを言っていないのでコンパイラはcore代わりに のデフォルト コンストラクタを使用するだけです。

対照的に、最初のケースでは、コンパイラによって生成されたデフォルトのコピー コンストラクターは、 のコピー コンストラクターを使用してサブオブジェクトを初期化するsampleよう要求するため、観察される動作になります。corecore

于 2011-12-30T19:35:49.137 に答える