Делегирующий конструктор
Делегирующий конструктор в C++ - это конструктор, который в списке инициализации вызывает другой конструктор того же класса. Это позволяет избежать дублирования кода при наличии нескольких конструкторов, выполняющих схожую инициализацию. Делегирующий конструктор указывается в списке инициализации после двоеточия и имеет вид ClassName(args). Такой вызов должен быть единственным элементом в списке инициализации - нельзя одновременно делегировать и инициализировать поля напрямую.
Синтаксис
ClassName(parameters) : ClassName(other_parameters)
{
// body
}
Пример
Давайте создадим класс Point с тремя конструкторами, где два конструктора делегируют инициализацию основному:
#include <iostream>
using namespace std;
class Point
{
private:
int x;
int y;
public:
Point(int x, int y) : x(x), y(y)
{
cout << "Main constructor" << endl;
}
Point(int x) : Point(x, 0)
{
cout << "Delegating constructor 1" << endl;
}
Point() : Point(0, 0)
{
cout << "Delegating constructor 2" << endl;
}
void print()
{
cout << x << " " << y << endl;
}
};
int main()
{
Point p1(1, 2);
p1.print();
Point p2(3);
p2.print();
Point p3;
p3.print();
return 0;
}
Результат выполнения кода:
"Main constructor"
1 2
"Main constructor"
"Delegating constructor 1"
3 0
"Main constructor"
"Delegating constructor 2"
0 0
Пример
Давайте создадим класс Rectangle, в котором конструктор с одним параметром делегирует инициализацию конструктору с двумя параметрами, создавая квадрат:
#include <iostream>
using namespace std;
class Rectangle
{
private:
int width;
int height;
public:
Rectangle(int width, int height) : width(width), height(height)
{
}
Rectangle(int side) : Rectangle(side, side)
{
}
int area()
{
return width * height;
}
};
int main()
{
Rectangle rect1(3, 4);
cout << rect1.area() << endl;
Rectangle rect2(5);
cout << rect2.area() << endl;
return 0;
}
Результат выполнения кода:
12
25
Смотрите также
-
конструктор
constructor,
который инициализирует объект класса -
список инициализации
ctor-init,
который задает начальные значения полей -
конструктор копирования
copy-ctor,
который создает копию объекта -
конструктор перемещения
move-ctor,
который перемещает ресурсы объекта