Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекции 1-2.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
142.98 Кб
Скачать

Init();

}

Boo(int value) {

Init();

// Делаем что-либо с value

}

Void Init()

{ // Код инициализации Boo }

};

Здесь мы подключаем функцию Init() для инициализации переменных-членов обратно значениями по умолчанию, а затем каждый конструктор вызывает функцию Init() перед своим фактическим выполнением.

Это сокращает дублирование кода до минимума и позволяет явно вызывать Init() из любого места в программе.

Делегирующие конструкторы в C++11

Начиная с C++11, конструкторам разрешено вызывать другие конструкторы. Этот процесс называется делегированием конструкторов (или «цепочкой конструкторов»).

Чтобы один конструктор вызывал другой, нужно просто сделать вызов этого конструктора в списке инициализации членов.

Например:

class Boo {

private:

public:

Boo() {

// Часть кода X

}

Boo(int value): Boo() // используем конструктор по умолчанию Boo() //для выполнения части кода X

{ // Часть кода Y }

};

Всё работает как нужно. Убедитесь, что вы вызываете конструктор из списка инициализации членов, а не из тела конструктора.

Вот еще один пример использования делегирующих конструкторов для сокращения дублированного кода:

#include <iostream>

#include <string>

class Employee {

private:

int m_id;

std::string m_name;

public:

Employee(int id=0, const std::string &name=""):

m_id(id), m_name(name) {

std::cout << "Employee " << m_name << " created.\n";

}

// Используем делегирующие конструкторы для сокращения //дублированного кода

Employee(const std::string &name) : Employee(0, name) { }

};

Int main() {

Employee a;

Employee b("Ivan");

return 0;

}

Этот класс имеет 2 конструктора (один из которых вызывает другой).

Таким образом, количество дублированного кода сокращено (нам нужно записать только одно определение конструктора вместо двух).

Ещё о делегирующих конструкторах

Во-первых, конструктору, который вызывает другой конструктор, не разрешается выполнять какую-либо инициализацию членов класса.

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

Во-вторых, один конструктор может вызывать другой конструктор, в коде которого может находиться вызов первого конструктора.

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

Вы можете избежать этого, убедившись, что в конструкторе, который вызывается, нет вызова первого (и вообще любого другого) конструктора.

Будьте аккуратны и не используйте вложенные вызовы конструкторов.

Деструкторы

Рассмотрим, что такое деструкторы в языке С++, зачем они нужны, как их использовать и нюансы, которые могут возникнуть при их использовании.

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

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

Когда объект автоматически выходит из области видимости или 

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

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

Однако, если объект класса содержит любые ресурсы (например, динамически выделенную память или файл/базу данных), или, если вам необходимо выполнить какие-либо действия до того, как объект будет уничтожен, деструктор является идеальным решением, поскольку он производит последние действия с объектом перед его окончательным уничтожением.