- •2.1 Елементи концепції ооп .. 20
- •1.1 Коментарі.
- •1.2 Прототипи функцій.
- •1.3 Операція розширення області видимості.
- •1.4 Оголошення в операторах.
- •1.5 Перегрузка функцій.
- •1.6 Значення формальних параметрів по замовчуванню.
- •1.7 Посилання та вказівники.
- •1.8 Специфікатор inline
- •1.9 Операції new та delete .
- •1.10 Вказівник на void.
- •1.11 Зв’язування із збереженням типів
- •1.12 Про структури та об’єднання.
- •2.1 Елементи концепції ооп.
- •2.3 Опис протоколу класу.
- •2.4 Передача повідомлень об’єктам.
- •3 Функції-члени.
- •3.1 Функції-члени в межах та за межами формального опису класу.
- •3.2 Про вказівник this.
- •3.3 Перевантаження функцій-членів. Параметри по замовчуванню.
- •4. Конструктори та деструктори.
- •4.1 Поняття про конструктори.
- •4.2 Деструктори.
- •4.3 Досягнення високої ефективності. Конструктор копіювання.
- •5 Глобальні та локальні об’єкти.
- •6 Статична пам’ять та класи.
- •7. Наслідування
- •7.1 Синтаксична реалізація наслідування
- •7.2 Правила доступу до полів даних
- •7.3 Конструктори та деструктори в похідних класах
- •7.4 Використання заміщуючих функцій-членів.
- •7.5 Похідні класи та вказівники.
- •7.6 Ієрархія типів
- •7.7 Множинне наслідування
- •8 Вiртуальнi функцiї та класи
- •8.1 Віртуальні функції.
- •8.2 Чисті віртуальні функції. Абстрактні класи.
- •8.3 Віртуальні деструктори.
- •8.4 Посилання як засіб для реалізації поліморфізму
- •8.5 Технічна реалізація механізму віртуальних функцій.
- •8.6 Віртуальні базові класи
- •8.6.1 Ієрархії класів та наслідування
- •8.6.2 Віртуальні базові класи
- •8.6.3 Виклик конструкторів та віртуальні базові класи.
- •9 Друзі
- •9.1 Дружні класи.
- •9.2 Дружні функції.
- •10 Перевантаження операторiв.
- •10.1 Перевантаження операторів. Загальний підхід.
- •10.2 Перетворення типів.
- •10.3 Перевантаження деяких операторів.
- •10.3.1 Оператор індексування масиву.
- •10.3.2 Перевантаження оператора виклику функції.
- •10.3.3 Оператор доступу до члена класу.
- •10.3.4 Перевантаження операторів інкремента та декремента.
- •10.3.5 Перевантаження операторів управління пам’яттю (new,delete).
- •10.3.6 Перевантаження оператора присвоювання.
- •11.1 Функціональні шаблони
- •11.1.1 Визначення та використання шаблонів функцiй.
- •11.1.2 Перевантаження шаблонiв функцiї.
- •11.1.3 Cпецiалiзованi функцiї шаблона.
- •11.2 Шаблони класів.
- •11.2.1 Визначення шаблонів класу
- •11.2.2 Константи та типи як параметри шаблону
- •11.2.3 Використання шаблонних класів
- •11.2.4 Спецiалiзацiя шаблонiв класу.
- •11.3 Шаблони та конфiгурацiя компiлятора.
- •11.3.1 Шаблони Smart.
- •11.3.2 Шаблони Global I External.
- •12.2 Переадресація вводу-виводу
- •12.3 Розширення потоків для типів кориcтувача
- •12.4 Операції роботи з потоком як дружні
- •12.5 Форматований ввід-вивід
- •12.5.1 Ширина поля
- •12.5.2 Заповнюючий символ
- •12.5.3 Число цифр дійсних чисел
- •12.5.4 Прапорці форматування
- •12.5.5 Маніпулятори
- •12.6 Стан потоку
- •12.7 Файловий ввід-вивід
- •12.7.1 Конструктори файлових потокiв
- •12.7.2 Вiдкриття файлу
- •12.8 Неформатований ввід-вивід
- •12.9 Деякі функції вводу-виводу
- •12.10 Форматування в пам’яті
- •13 Управління виключеннями
- •13.1 Виключення та стек
- •13.2.1 Синтаксис основних конструкцій
- •13.2.1.1 Використання try та сatch
- •13.2.1.2 Використання throw
- •13.2.2 Тип виключення та конструктор копії
- •13.2.3 Пошук відповідного типу виключення
- •13.2.4 Використання terminate() та некеровані виключення
- •13.2.5 Робота з специфікаціями виключень
- •13.2.6 Робота з непередбаченими виключеннями
- •13.2.7 Робота з конструкторами та виключеннями
- •13.2.8 Динамічні об’єкти
- •13.2.9 Передача значень з конструктора та деструктора
- •13.2.10 Робота з ієрархіями виключень
- •13.2.11 Робота з специфічними класами виключень
- •13.3 Структурне управління виключеннями
- •13.3.1 Використання кадрованого управління виключеннями
- •13.3.1.1 Синтаксис
- •13.3.1.2 Про функцію RaiseException()
- •13.3.1.3 Фільтруючий вираз
- •13.3.1.4 Перехоплення виключення процесора
- •13.3.2 Використання завершуючих обробників виключень
13.2.1 Синтаксис основних конструкцій
Управління виключеннями С++ є частиною стандарта ANSI C++. Цей стандарт підтримує кінцеву модель управління: після того, як управління було зафіксоване, процедура обробки не може вимагати, щоб виконання було продовжене з точки виключення. Виключення С++ також не підтримують обслуговування асинхронних подій, таких, як помилки обладнання чи обробку переривань. Обслуговуються лише виключення, які в явному вигляді сигналізуються деякою функцією. В контексті управління виключеннями в С++ використовуються три ключових слова: try, catch та thow.
13.2.1.1 Використання try та сatch
Ключове слово try служить для позначення блока кода, який може генерувати виключення. Блок поміщується в фігурні дужки:
try
{
cout<<“in try-block . . .”<<endl;
func(); //функція може генерувати виключення
}
Ключове слово catch слідує за try-блоком і позначає секцію кода, в яку може бути передано управління в тому випадку, коли відбудеться виключення (називають catch-обробник чи обробник виключення). За ключовим словом слідує опис виключення, поміщений у фігурних дужках, який складається з імені типу та необов’язкової змінної. Ім’я типу ідентифікує тип виключення, яке даний код може обслуговувати. Можна розглянути опис виключення як параметр функції . За try-блоком може слідувати кілька операторів catch. Розглянемо приклад:
#include<iostream.h>
void func(void);
int main(void)
{
try
{ cout “in try=block . . .”<<endl;
func();//може генерувати виключення
}
catch(int i)
{ }
catch( const char*)
{ }
//обробляє всі необслужені виключення
catch(...)
{ }
return 0;
}
Оператор catch з трьома крапками (. . .) перехоплює виключення будь-якого типу і повинен бути останням з операторів catch, що слідують за try-блоком.
13.2.1.2 Використання throw
Ключове слово throw викидає виключення і викликає перехід управління до обробника. За ключовим словом може слідувати вираз.
throw з операндом
Вираз, що слідує за throw, зводиться до значення змінної певного типу. Можна розглядати операнд throw як аргумент виклику функції. Тип операнда визначає, який з обробників може перехопити виключення. Місцезнаходження оператора throw називають точкою викида.
Приклад:
#include<cstring.h>
void func1()
{ if (що небудь не впорядку) throw ” виявлена помилка”; }
void func2()
{
if(що_небудь_не_в_порядку)
{ string str(“Oй !!!!!!!”);
throw str;
}
}
Відмітимо, що викидатись можуть як стандартні типи, так і типи користувача. Тоді можна передати обробнику об’єкт, навантажений інформацією.
throw без операнда
Якщо ключове слово throw використовується без операнда, то знову викидається те виключення, яке обробляється в даний момент. Звідси випливає, що така форма оператора може використовуватись тільки в cach-обробнику
( чи в функції, яка явно чи неявно ним викликається).
Перехоплення throw
Коли виконується оператор throw , функції виконуючої бібліотеки С++ виконують наступні дії:
-
створюють копію викинутого об’єкта-змінної;
-
Розмотують стек, викликаючи деструктори локальних об’єктів, які виходять з області видимості;
-
передають управління найближчому обробнику catch , який приймає параметр, сумісний за типом з викинутим об’єктом. Копія об’єкта передається обробнику в якості параметра.
Розглянемо приклад:
#include<fstream.h>
class TaleTelling
{public:
TaleTelling()
{ cout<<“Жили-були TaleTelling”<<endl;}
~TaleTelling()
{cout<<“І померли TaleTelling...”<<endl;
}};
void function1(void)
{
ifsteram ifs(“\\invalid\\file\\name”);
if (!ifs)
{cout<<“викидаємо виключення”<<endl;
throw “помилка при відкриттю файла”;
}}
void function2(void)
{
//створимо локальний об’єкт, щоб перевірити виклик деструктора при //розмотуванні стека
TaleTelling tellme;
//викликається функція, що викидає виключення
functoin1();}
int main(void)
{
try
{
cout<<“увійшли в try-блок”<<endl;
function2();
cout<<“виходимо з try-блока”<<endl;
}
catch(int i)
{
cout<<“викликаний обробник int”<<endl;
return -1;
}
catch(const char *p)
{
cout<<“викликаний обробник char*”<<endl;;
return -1;
}
catch(...)
{cout<<“викликаний обробник catch_all”<<endl;
return -1;
}
return 0; // обійшлося без пригод
}
Результати роботи:
увійшли в try-блок
Жили-були TaleTelling
викидаємо виключення
І померли TaleTelling...
викликаний обробник char*[ помилка при відкритті файла]
Відмітимо наступні моменти:
деструктор локальної змінної tellme був викликаний вірно, хоч і з функції function1 управління було передане безпосередньо обробнику виключення;
оператор з main() , який містить повідомлення “виходимо з try-блока “ так і не був виконаним.