
- •Список литературы по модулю
- •История языка C++
- •Основные особенности C++
- •Простые расширения языка C
- •Объявление переменных ссылочного типа
- •Инициализация и использование ссылок
- •Ссылки в формальных параметрах функций
- •Ссылки как возвращаемые значения функций
- •Константные ссылки
- •Объявление класса
- •Секции в объявлении класса
- •Пример: секции в объявлении класса
- •Объявление полей
- •Определения статических полей
- •Объявление методов
- •Виртуальные и абстрактные методы
- •Объявление конструкторов
- •Пример: объявление конструкторов
- •Создание объектов в динамической памяти
- •Создание массивов в динамической памяти
- •Удаление объектов и массивов
- •Объявление деструктора
- •Пример: объявление деструктора
- •Объекты в автоматической памяти
- •Пример: автоматический вызов деструктора
- •Пример: автоматический вызов деструктора (продолжение)
- •Объекты в глобальной памяти
- •Объекты в полях других объектов
- •Пример: объекты в полях других объектов
- •Проблема копирования объектов
- •Объявление конструктора копий
- •Перегруженная операция присваивания
- •Основной способ наследования в C++
- •Пример: одиночное наследование
- •Переопределение методов
- •Пример: переопределение методов
- •Динамическое приведение типов
- •Пример: динамическое приведение типов не всегда допустимо
- •Пример: динамическое приведение типов
- •private- и protected-наследование
- •Наследование от нескольких базовых классов
- •Иерархия наследования и классы противоречия
- •Неоднозначности в противоречивых иерархиях
- •Разрешение неоднозначностей
- •Основная проблема противоречивых иерархий
- •Виртуальное наследование
- •Пример: виртуальное наследование
- •Понятие шаблона
- •Типовые формальные параметры шаблона
- •Нетиповые формальные параметры шаблона
- •Шаблонные формальные параметры шаблона
- •Значения параметров шаблона по умолчанию
- •Зависимые идентификаторы в шаблоне
- •Инстанциация шаблонов
- •Выведение фактических параметров при инстанциации шаблона функции
- •Требования к фактическим параметрам шаблонов
- •Специализация шаблона функции
- •Пример: специализация шаблона функции
- •Пример: перегрузка имеет больший приоритет, чем специализация
- •Cпециализация шаблона класса
- •Пример: специализация шаблона класса
- •Частичная специализация шаблона класса
- •Вычисления во время компиляции
- •Пример: возведение числа в степень
- •Понятие перегрузки операций
- •Ассортимент перегружаемых операций
- •Перегрузка операции присваивания
- •Операция присваивания возвращает левое значение
- •Составные операции присваивания
- •Перегрузка бинарных арифметических операций
- •Перегрузка операций сравнения
- •Перегрузка операций с помощью функций
- •Перегрузка унарных операций
- •Перегрузка операции приведения типа
- •Исключения
- •Оператор throw
- •Пример: оператор throw
- •Синтаксис try- и catch-блоков
- •Пример: перехват исключения std::bad_alloc
- •Жизненный цикл объектов-исключений
- •Пример 1: жизненный цикл объектов-исключений
- •Пример 2: жизненный цикл объектов-исключений
- •Пример 3: жизненный цикл объектов-исключений
- •Пример: уничтожение автоматических объектов в процессе передачи исключения в catch-блок
- •Перехват исключений в инициализаторах конструкторов
- •Пример: перехват исключений в инициализаторах конструкторов
- •Спецификатор throw в заголовках функций
- •Пример 1: спецификатор throw
- •Пример 2: спецификатор throw
- •Спецификатор throw и переопределение виртуальных методов
- •Создание классов исключений
- •Пример: создание классов исключений

Жизненный цикл объектов-исключений
Базовые
сведения
Обобщённое программирова-
ние
Перегрузка
операций
Исключения
Порождение
Перехват и
обработка
Спецификация
Класс exception
Исследуем жизненный цикл объектов исключений с помощью класса A, который протоколирует факты создания, копирования и уничтожения своих экземпляров:
struct A {
bool is_copy ; A ();
A( const A & obj ); ~A ();
void report ();
};
A :: A (): is_copy ( false )
{ cout << " new " << ’\n ’; }
A :: A( const A & obj ): is_copy ( true ) { cout << " copy " << ’\n ’; }
A ::~ A () { cout << " destroy " << is_copy << ’\n ’; }
void A :: report () { cout << " report \n"; } |
87 / 99 |
|

Пример 1: жизненный цикл объектов-исключений
Базовые
сведения
Обобщённое программирова-
ние
Перегрузка
операций
Порождение объекта-исключения в куче и перехват, при котором он передаётся в catch-блок по указателю. В конце catch-блока необходимо явное уничтожение объекта.
int main ()
{
Исключения
Порождение
Перехват и
обработка
Спецификация
Класс exception
try { |
|
|
throw |
new |
A (); |
} catch (A |
*a) |
{ |
a -> report (); |
||
delete |
a; |
|
} |
|
|
return 0; |
|
|
}
Вывод:
new report destroy 0
88 / 99

Пример 2: жизненный цикл объектов-исключений
Базовые
сведения
Обобщённое программирова-
ние
Перегрузка
операций
Исключения
Порождение
Перехват и
обработка
Порождение временного объекта-исключения и перехват, при котором создаётся его копия.
int main ()
{
try {
throw A (); } catch (A a) {
a. report ();
Спецификация
Класс exception
}
return 0;
}
Вывод:
new copy report
destroy 1 destroy 0
89 / 99

Пример 3: жизненный цикл объектов-исключений
Базовые
сведения
Обобщённое программирова-
ние
Перегрузка
операций
Порождение временного объекта-исключения и перехват, при котором он передаётся в catch-блок по ссылке, т.е. без создания копии.
int main ()
{
Исключения
Порождение
Перехват и
обработка
Спецификация
Класс exception
try { |
|
|
throw |
A (); |
|
} catch |
(A |
&a) { |
a. report (); |
||
} |
|
|
return |
0; |
|
}
Вывод:
new report destroy 0
90 / 99