Перейти к основному содержимому

Конструктор копирования и список инициализации

· 2 мин. чтения
Дмитрий Аладин
Преподаватель

В данной статье представлен пример работы конструктора копирования в списке инициализации.

В примере ниже демонстрируется, что в списках инициализации используются конструкторы копирования. Обратите внимание, что использование унифицированной инициализации {} в списке инициализации в конструкторе с параметрами explicit C(const A &a, const B &b) также вызывает конструктор копирования, как и (): a_(a), b_{b}.

#include <iostream>
using namespace std;

class A {
protected:
int value_;

public:
A() : value_{} { cout << "A()" << endl; }
A(const A &a) {
cout << "A(B&)" << endl;
value_ = a.value_;
}
};

class B : public A {
public:
B() : A() { cout << "B()" << endl; }
B(const B &b) : A(b) { cout << "B(B&)" << endl; }
};

class C {
A a_;
B b_;

public:
C() : a_{}, b_{} { cout << "C()" << endl; }
C(const C &c) : a_(c.a_), b_(c.b_) { cout << "C(C&)" << endl; }
explicit C(const A &a, const B &b) : a_(a), b_{b} {
cout << "C(A&,B&)" << endl;
}
};

int main() {
A a; // A()
cout << "----" << endl; // ----
B b; // A()
// B()
cout << "----" << endl; // ----
C c1; // A()
// A()
// B()
// C()
cout << "----" << endl; // ----
C c2(a, b); // A(B&)
// A(B&)
// B(B&)
// C(A&,B&)
cout << "----" << endl; // ----
C c3(c2); // A(B&)
// A(B&)
// B(B&)
// C(C&)
}