Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование на C++.pdf
Скачиваний:
61
Добавлен:
23.03.2016
Размер:
1.88 Mб
Скачать

Жизненный цикл объектов-исключений

Базовые

сведения

Обобщённое программирова- ние

Перегрузка

операций

Исключения

Порождение

Перехват и

обработка

Спецификация

Класс 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