Конструкторы в C++ — специальные методы класса (или структуры), которые вызываются при создании объекта для инициализации его данных-членов.

Для аналогии можно вспомнить инициализацию в Python:

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
 
x = Complex(3.0, -4.5)
x.r, x.i

Типы конструкторов:

  1. Конструктор по умолчанию (Default constructor): Не принимает аргументов.
  2. Параметризованный конструктор (Parameterized constructor): Принимает один или несколько аргументов.
  3. Конструктор копирования (Copy constructor): Принимает объект того же класса по константной ссылке.
  4. Конструктор перемещения (Move constructor): Принимает объект того же класса по rvalue-ссылке.

Конструкторы работают в паре со списками инициализации, которые указывается после заголовка конструктора и перед телом конструктора, инициализаторы разделяются запятыми.

Пример:

#include <iostream>
using namespace std;
 
struct Person {
    string name;
    int age;
 
    // Конструктор по умолчанию
    Person() : name("Unknown"), age(0) {}
 
    // Параметризованный конструктор
    Person(string n, int a) : name(n), age(a) {}
 
    // Конструктор копирования
    Person(const Person &other) : name(other.name), age(other.age) {}
 
    // Конструктор перемещения. Теперь в оригинале не будет имени
    Person(Person &&other) noexcept : name(move(other.name)), age(other.age) {
        other.age = 0; // Обнуление данных в оригинальном объекте.
    }
};
 
int main() {
    Person p1; // вызов конструктора по умолчанию
    Person p2("John", 30); // вызов параметризованного конструктора
    Person p3(p2); // вызов конструктора копирования
    Person p4(move(p2)); // вызов конструктора перемещения
 
    cout << "Name: " << p1.name << ", Age: " << p1.age << endl;
    cout << "Name: " << p2.name << ", Age: " << p2.age << endl; // p2 теперь пустой
    cout << "Name: " << p3.name << ", Age: " << p3.age << endl;
    cout << "Name: " << p4.name << ", Age: " << p4.age << endl;
    
    return 0;
}

В этом примере:

  • Person() — конструктор по умолчанию.
  • Person(string n, int a) — параметризованный конструктор.
  • Person(const Person &other) — конструктор копирования.
  • Person(Person &&other) — конструктор перемещения.