Foo f1;
Foo f2(f1);
Да, это будет делать то, что вы ожидаете:
Вызывается конструктор копирования f2 Foo :: Foo (Foo const &).
Эта копия создает свой базовый класс, а затем каждый член (рекурсивно)
Если вы определяете класс следующим образом:
class X: public Y
{
private:
int m_a;
char* m_b;
Z m_c;
};
Следующие методы будут определены вашим компилятором.
- Конструктор (по умолчанию) (2 версии)
- Конструктор (Копия)
- Деструктор (по умолчанию)
- Оператор присваивания
Конструктор: по умолчанию:
На самом деле есть два конструктора по умолчанию.
Один используется для zero-initialization
, а другой - для value-initialization
. Используемое зависит от того, используете ли вы ()
во время инициализации или нет.
// Zero-Initialization compiler generated constructor
X::X()
:Y() // Calls the base constructor
// If this is compiler generated use
// the `Zero-Initialization version'
,m_a(0) // Default construction of basic PODS zeros them
,m_b(0) //
m_c() // Calls the default constructor of Z
// If this is compiler generated use
// the `Zero-Initialization version'
{
}
// Value-Initialization compiler generated constructor
X::X()
:Y() // Calls the base constructor
// If this is compiler generated use
// the `Value-Initialization version'
//,m_a() // Default construction of basic PODS does nothing
//,m_b() // The values are un-initialized.
m_c() // Calls the default constructor of Z
// If this is compiler generated use
// the `Value-Initialization version'
{
}
Примечания. Если базовый класс или какие-либо члены не имеют допустимого видимого конструктора по умолчанию, тогда конструктор по умолчанию не может быть создан. Это не ошибка, если ваш код не пытается использовать конструктор по умолчанию (тогда только ошибка времени компиляции).
Конструктор (Копия)
X::X(X const& copy)
:Y(copy) // Calls the base copy constructor
,m_a(copy.m_a) // Calls each members copy constructor
,m_b(copy.m_b)
,m_c(copy.m_c)
{}
Примечания. Если базовый класс или какие-либо члены не имеют допустимого видимого конструктора копирования, то конструктор копирования не может быть создан. Это не ошибка, если ваш код не пытается использовать конструктор копирования (тогда только ошибка времени компиляции).
Оператор присваивания
X& operator=(X const& copy)
{
Y::operator=(copy); // Calls the base assignment operator
m_a = copy.m_a; // Calls each members assignment operator
m_b = copy.m_b;
m_c = copy.m_c;
return *this;
}
Примечания. Если базовый класс или какие-либо члены не имеют действительного оператора допустимого назначения, то оператор назначения не может быть создан. Это не ошибка, если ваш код не пытается использовать оператор присваивания (тогда только ошибка времени компиляции).
Destructor
X::~X()
{
// First runs the destructor code
}
// This is psudo code.
// But the equiv of this code happens in every destructor
m_c.~Z(); // Calls the destructor for each member
// m_b // PODs and pointers destructors do nothing
// m_a
~Y(); // Call the base class destructor
- Если объявлен любой конструктор (включая копию), то конструктор по умолчанию не реализован компилятором.
- Если конструктор копирования объявлен, компилятор его не сгенерирует.
- Если оператор присваивания объявлен, компилятор его не сгенерирует.
- Если объявлен деструктор, компилятор его не сгенерирует.
Глядя на ваш код, генерируются следующие конструкторы копирования:
Foo::Foo(Foo const& copy)
:bar(copy.bar)
{}
Bar::Bar(Bar const& copy)
:i(copy.i)
,baz(copy.baz)
{}
Baz::Baz(Baz const& copy)
:j(copy.j)
{}