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

Конструкторы и деструктор

Конструктор класса — это специальный метод, который вызывается при создании объекта этого класса. Он используется для инициализации членов класса, выделения ресурсов и выполнения других операций, необходимых для корректной работы объекта.

В C++ существует несколько видов конструкторов:

  • конструктор по умолчанию (default constructor)
  • конструктор с параметрами (parameterized constructor)
  • конструктор копирования (copy constructor)
  • конструктор перемещения (move constructor)

Синтаксис

class Matrix3 {
public:
Matrix3();
Matrix3(int value);
Matrix3(const Matrix3& other);
Matrix3(Matrix3&& other) noexcept;
~Matrix3();

private:
int* data;
};

Конструктор с одним параметром может быть помечен как explicit, это запретит неявное преобразование из параметра в объект класса.

class Matrix3 {
// ...
explicit Matrix3(int value);
// ...
};

Если какой-либо из конструкторов не указан в описании класса, компилятор может неявно добавить его на этапе компиляции. Компилятору можно прямо указать, чтобы он создал стандартный конструктор или, наоборот, не создавал его. В первом случае используется синтаксис = default, а во втором — = delete.

class Matrix3 {
// ...
Matrix3() = default;
Matrix3(Matrix3&& other) = delete;
// ...
}

Для инициализации полей класса используется специальный синтаксис. После сигнатуры ставится двоеточие и через запятую указываются начальные значения для полей.

Class::Class(T1 v1, T2 v2) : field1(v1), field2(v2) {
// ...
}

Конструктор по умолчанию

Конструктор по умолчанию — вид конструктора, который не принимает никаких аргументов. Он автоматически вызывается при создании объекта класса без передачи параметров конструктору.

Matrix3::Matrix3() : data(new int[9]) {
for (size_t i = 0; i < 9; i++) {
this->data[i] = 0;
}
}

Конструктор с параметрами

Конструктор с параметрами — вид конструктора, принимающий аргументы, которые используются для задания нестандартного начального состояния объекта.

Matrix3::Matrix3(int value) : data(new int[9]) {
for (size_t i = 0; i < 9; i++) {
this->data[i] = value;
}
}

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

Конструктор копирования — вид конструктора, который создает новый объект на основе объекта того же типа.

По умолчанию значения полей старого объекта копируются в новый. Как правило, копирование должно гарантировать, что изменения в одном объекте не влияют на другой.

Matrix3::Matrix3(const Matrix3& other) : data(new int[9]) {
for (size_t i = 0; i < 9; i++) {
this->data[i] = other.data[i];
}
}

Конструктор перемещения

Конструктор перемещения — это специальный метод, который позволяет эффективно перемещать ресурсы объекта, вместо их копирования. В первую очередь это позволяет оптимизировать работу с динамической памятью.

При этом после перемещения старый объект должен перестать быть валидным и более не использоваться.

Matrix3::Matrix3(Matrix3&& other) noexcept : data(other.data) {
other.data = nullptr;
}

Как правило конструктор перемещения маркируется как noexcept.

Деструктор

Деструктор — это специальный метод, который вызывается при уничтожении объекта. Его задача — освобождение ресурсов, выделенных объектом, и выполнение других операций, необходимых перед удалением объекта из памяти.

Деструктор вызывается автоматически при выходе из области видимости объекта и при вызове оператора delete для динамически выделенных объектов.

Matrix3::~Matrix3() {
delete[] data;
}