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: конструктор копирования не объявлен явно для примера класса

(Type1 показан в приведенном выше коде. Затем конструктор копирования класса sample неявно генерируется компилятором). Когда заявление, Line1 выполняется сначала конструктор копирования class core вызывается, а затем конструктор копирования class sample вызывается.

Тип 2: Копировать конструктор, определенный явно для образца класса

Когда заявление, Line1 выполняется сначала конструктор по умолчанию class core вызывается, а затем конструктор копирования class sample вызывается.

Вопрос:

Почему эта разница в поведении для конструктора копирования, как упоминалось в Type1 и Type2?

1 ответ

Решение

Поскольку конструктор копирования вы явно определяете для sample не просит coreКопировать конструктор Вы должны написать : core(obj) если вы хотите, чтобы это произошло.

Иными словами, когда вы пишете явный конструктор копирования, вы берете на себя ответственность за создание копии sampleв том числе его core субобъект. Написав это так, как вы сделали, вы решили не инициализировать core подобъект с использованием obj, Поскольку вы не сказали, как хотите , чтобы он был инициализирован, компилятор просто использует coreВместо этого используется конструктор по умолчанию, поэтому вы будете описывать поведение во втором случае.

Напротив, в первом случае созданный компилятором конструктор копирования по умолчанию для sample действительно просит core подобъект должен быть инициализирован с помощью coreКопировать конструктор, отсюда и наблюдаемое поведение.

Другие вопросы по тегам