3. Создание и уничтожение объектов в С++.

Конструкторы и деструкторы. Виды конструкторов. Раздел инициализации конструкторов. Способы создания объектов.

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

Конструктор

Компилятор по умолчанию предоставляет два конструктора(отвечают за инициализацию объекта): копирования и инициализации.

  • При не определении явно конструктора - то устанавливается по умолчанию.

  • Не имеет типа возврата.

<имя класса>::<имя класса/конструктора>([<список параметров>])[:<раздел инициализации>]
{
<тело конструктора>
};

Пример

A::A(int i): a(i), // можем инициализировать член объекта 
             cа(i) // можем -------- константный член объекта
             sа(i), //  не можем ------ члены класса
             scа(i) // не можем ------ константный член класса
{
    // Объект уже создан
    a = i; // ОК!
    сa = i; // Error!
    sa = i; // OK!
    csa = i; // Error!
};

Деструктор

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

Начиная с C++17 можно явно вызывать деструктор полным префикcионным именем, то есть с указанием имени класса/объекта.

Вызовы

  • При определении какого-то объекта.

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

    • Если это локальные статический данные, то конструктор вызывается в порядке вызова, при первой передачи параметра в блок. Уничтожение в обратном порядке

    • Если локальный автоматический объект, то --------------. Уничтожается после выхода из области видимости, вызывается деструктор.

  • Динамическое выделение памяти - два оператора new и delete

    • new вызов конструктора

    • delete вызов деструктора

Важно: всегда явно определять конструктор копирования, деструктор и оператор присваивания.

Пример вызова конструкторов по умолчанию какого-либо класса A:

A obj1; // Конструктор инициализации
A obj2(obj1); // Конструктор копирования

Из книги Герберта Шилдта "Самоучитель С++" про конструкторы копирования.

Когда мы передаем объект в какую-то функцию, например, void display(MyClass obj); создается копия этого объекта (и эта копия становится параметром функции). Когда при вызове функции создается копия объекта, обычный конструктор (то есть инициализации) не вызывается, вместо этого вызывается конструктор копий объекта.

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

Важное замечание: когда мы передаем в функцию какой-то объект по ссылке, конструктор не вызывается. То есть в случае с void display(MyClass& obj); конструктор копирования бы не вызывался.

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

Last updated