- •1)Краткий обзор основных парадигм программирования
- •Основные принципы ооп
- •Абстрактные типы данных
- •Синтаксис описания класса
- •Управление доступом к членам класса
- •Манипуляции с состоянием объекта
- •Класс как область видимости
- •Объявление и определение методов класса. Спецификатор inline
- •Указатель на член класса
- •Указатель this
- •Конструкторы и деструкторы
- •Конструктор умолчания
- •Конструктор преобразования и конструкторы с двумя и более параметрами
- •Конструктор копирования
- •Порядок вызова конструкторов и деструкторов
- •Статические члены класса
- •Константные члены класса. Модификатор const
- •Друзья классов
- •Статический полиморфизм
- •Перегрузка бинарных операций
- •Перегрузка унарных операций
- •Перегрузка функций
- •Виды отношений между классами
- •Одиночное наследование
- •Правила наследования
- •Преобразования указателей.
- •Правила видимости при наследовании.
- •Закрытое (private) наследование
- •Перекрытие имен
- •Динамический полиморфизм, механизм виртуальных функций
- •Реализация виртуальных функций
- •Абстрактные классы. Чистые виртуальные функции
- •12. Средства обработки ошибок, исключения и обработка исклю-чений
- •Правила выбора обработчика исключения
Порядок вызова конструкторов и деструкторов
Итак, конструкторы можно классифицировать по набору входных парамет-
ров следующим образом: |
|
|
1) |
x() |
– конструктор умолчания |
2) |
x(x&), x(const x&) |
– конструктор копирования |
3) |
x(t), x(t&), x(const t&) – конструктор преобразования |
|
4) |
конструктор с двумя и более параметрами |
|
В классе может быть описано несколько конструкторов преобразования и конструкторов с двумя и более параметрами. Единственное требование к ним: не может быть двух конструкторов с одинаковым (по типам) набором параметров, в частности, не может быть двух конструкторов умолчания.
При создании объекта конструкторы вызываются в следующем порядке:
Конструкторы базовых классов, если класс для создаваемого объекта является наследником других классов в порядке их появления в описа-нии класса. Если в списке инициализации описываемого класса присут-ствует вызов конструктора преобразования (или конструктора с двумя и более параметрами) базового класса, то вызывается конструктор преоб-разования (или конструктор с двумя и более параметрами), иначе вы-зывается конструктор умолчания базового класса.
Конструкторы умолчания всех вложенных информационных членов, которые не перечислены в списке инициализации, и конструкторы пре-образования, копирования и конструкторы с двумя и более параметрами всех вложенных информационных членов, которые перечислены в спи-ске инициализации. Все перечисленные в данном пункте конструкторы (умолчания, преобразования, копирования, с двумя и более параметра-ми) вызываются в порядке описания соответствующих информационных членов в классе.
Собственный конструктор.
Такая последовательность вызова конструкторов логически обосновывается тем, что в момент выполнения собственного конструктора все информационные поля должны быть уже проинициализированы.
Деструкторы вызываются в обратном порядке:
Собственный деструктор. В момент начала его работы поля класса еще не очищены, и их значения могут быть использованы в теле деструктора.
Деструкторы вложенных объектов в порядке, обратном порядку их описания.
Деструкторы базовых классов в обратном порядке их задания.
Свод ситуаций, при которых вызываются конструкторы и деструкторы
Обычный конструктор (не копирования) вызывается:
при создании объекта ( при обработке описания объекта);
при создании объекта в динамической памяти (с использованием опе-рации new). При этом в динамической памяти предварительно отводится необходимый по объему фрагмент памяти;
при композиции объектов;
при создании объекта производного класса.
Замечание. Если в программе создается не единичный (скалярный) объект, а массив объектов, то в соответствующем классе (структуре) должен быть конст-руктор умолчания (явно или неявно сгенерированный). Действительно, при объ-явлении массива объектов или создании массива в динамической памяти указы-вается размерность массива, что несовместимо с заданием параметров для кон-структора преобразования или конструктора с двумя и более параметрами:
class X{ . . .}; X* x1 = new X[10];
Как уже было указано, если в классе явно описан хотя бы один конструктор, то конструктор умолчания не генерируется системой неявно. Для удаления такого массива должна применяться векторная форма операции delete, при исполь-зовании которой деструктор вызывается для каждого элемента массива:
delete[] x1;
Конструктор копирования вызывается:
1) при инициализации создаваемого объекта:
-
box
a(1,2,3);
//
вызов конструктора с тремя параметрами
box
b = a;
//
инициализация
при инициализации временным объектом: box c = box(3,4,5);
при передаче параметров-объектов в функцию по значению: int f(box b);
при возвращении результата работы функции в виде объекта. 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)
{. . .}
Деструктор вызывается:
при свертке стека – при выходе из блока описания объекта, в частности, при обработке исключений (при выходе из try-блока по оператору throw, try-блоки описываются далее), завершении работы функций;
при уничтожении временных объектов – сразу, как только завершится конструкция, в которой они использовались;
при выполнении операции delete для указателя, получившего значение в результате выполнения операции new. После выполнения деструктора освобождается выделенный для объекта участок памяти;
при завершении работы программы при уничтожении глобальных и статических объектов.
Примечание. Все правила описания и использования конструкторов и деструк-торов применимы и для структур.
