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
Копировать конструктор, отсюда и наблюдаемое поведение.