2 различных типа вызова конструктора из конструктора копирования - PullRequest
1 голос
/ 30 декабря 2011

Рассмотрим пример кода ниже:

#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 Ответ

7 голосов
/ 30 декабря 2011

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

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

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

...