Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ответы на вопросы ООП.docx
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
203 Кб
Скачать
☆
  1. Порядок вызова конструкторов и деструкторов

Итак, конструкторы можно классифицировать по набору входных парамет-

ров следующим образом:

1)

x()

– конструктор умолчания

2)

x(x&), x(const x&)

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

3)

x(t), x(t&), x(const t&) – конструктор преобразования

4)

конструктор с двумя и более параметрами

В классе может быть описано несколько конструкторов преобразования и конструкторов с двумя и более параметрами. Единственное требование к ним: не может быть двух конструкторов с одинаковым (по типам) набором параметров, в частности, не может быть двух конструкторов умолчания.

При создании объекта конструкторы вызываются в следующем порядке:

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

  1. Конструкторы умолчания всех вложенных информационных членов, которые не перечислены в списке инициализации, и конструкторы пре-образования, копирования и конструкторы с двумя и более параметрами всех вложенных информационных членов, которые перечислены в спи-ске инициализации. Все перечисленные в данном пункте конструкторы (умолчания, преобразования, копирования, с двумя и более параметра-ми) вызываются в порядке описания соответствующих информационных членов в классе.

  1. Собственный конструктор.

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

Деструкторы вызываются в обратном порядке:

  1. Собственный деструктор. В момент начала его работы поля класса еще не очищены, и их значения могут быть использованы в теле деструктора.

  1. Деструкторы вложенных объектов в порядке, обратном порядку их описания.

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

Свод ситуаций, при которых вызываются конструкторы и деструкторы

Обычный конструктор (не копирования) вызывается:

  1. при создании объекта ( при обработке описания объекта);

  1. при создании объекта в динамической памяти (с использованием опе-рации new). При этом в динамической памяти предварительно отводится необходимый по объему фрагмент памяти;

  1. при композиции объектов;

  1. при создании объекта производного класса.

Замечание. Если в программе создается не единичный (скалярный) объект, а массив объектов, то в соответствующем классе (структуре) должен быть конст-руктор умолчания (явно или неявно сгенерированный). Действительно, при объ-явлении массива объектов или создании массива в динамической памяти указы-вается размерность массива, что несовместимо с заданием параметров для кон-структора преобразования или конструктора с двумя и более параметрами:

class X{ . . .}; X* x1 = new X[10];

Как уже было указано, если в классе явно описан хотя бы один конструктор, то конструктор умолчания не генерируется системой неявно. Для удаления такого массива должна применяться векторная форма операции delete, при исполь-зовании которой деструктор вызывается для каждого элемента массива:

delete[] x1;

Конструктор копирования вызывается:

1) при инициализации создаваемого объекта:

box

a(1,2,3);

//

вызов конструктора с тремя параметрами

box

b = a;

//

инициализация

  1. при инициализации временным объектом: box c = box(3,4,5);

  1. при передаче параметров-объектов в функцию по значению: int f(box b);

  2. при возвращении результата работы функции в виде объекта. box f ();

Примечание 1. Если используется оптимизирующий компилятор, то при обра-ботке инициализации вида:

box c = box(3,4,5)

временный объект не создается, и вместо конструктора копирования используется кон-

структор с тремя параметрами:

(box c(3,4,5)).

Примечание 2. Если при возвращении результата работы функции в виде объекта тип возвращаемого значения не совпадает с типом результата работы функции, то вы-зывается не конструктор копирования, а конструктор преобразования или функция преобразования ( описывается ниже). Данное преобразование выполняется, если оно однозначно. Иначе фиксируется ошибка.

Пример:

class Y; class X{

. . .

public:

X(const Y& y1);

. . .

};

class Y{

. . .

public:

. . .

X f(){

. . .

return *this;

}

};

X::X(const Y& y1)

{. . .}

Деструктор вызывается:

  1. при свертке стека – при выходе из блока описания объекта, в частности, при обработке исключений (при выходе из try-блока по оператору throw, try-блоки описываются далее), завершении работы функций;

  1. при уничтожении временных объектов – сразу, как только завершится конструкция, в которой они использовались;

  1. при выполнении операции delete для указателя, получившего значение в результате выполнения операции new. После выполнения деструктора освобождается выделенный для объекта участок памяти;

  1. при завершении работы программы при уничтожении глобальных и статических объектов.

Примечание. Все правила описания и использования конструкторов и деструк-торов применимы и для структур.