- •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 Управління виключеннями
Під управлінням виключеннями(exeption handling) розуміють стандартний інтерфейс для виявлення та обробки незвичайних, непередбачених та виключних станів чи подій. Воно представляє формальний спосіб відхилити потік управління функції на неспецифіковану секцію кода, готову прийняти контроль над даною виключною ситуацією. Borland C++ підтримує два різновиди управління виключеннями:
-
управління виключеннями мови С++
-
структуроване управління виключеннями мови С
Виключення мають ряд переваг над традиційними методами повідомлень про помилкові стани:
-
єдинообразність стилю, яка покращує читабельність програми
-
відсутність глобальних змінних та визначених користувачем процедур, що використовуються в таких цілях
-
розширення можливостей відладки. Механізм виключень є інтегрованою частиною мови та використовує підтримку бібліотек;відладчик забезпечує спеціалізовану підтримку, дозволяючи відслідковувати виключні ситуації.
-
неможливість для програм ігнорувати помилки та продовження виконання
Розглянемо синтаксис та використання обох механізмів.
13.1 Виключення та стек
Коли функція “викидає” (термін С++) чи “заявляє” (структурне управління С) виключення, управління передаєтьсмя для деякої секції кода, що належить функції, яка ще знаходиться у стеці викликів. Іншими словами, управління може бути переданим лише функції, яка була викликана раніше та ще не завершилась.
Стек являє собою область пам’яті, в якій зберігаються локальні (тимчасові) змінні та адреси повернення з функції. На комп’ютерах з процесорами INTEL регістр SP(вказівник стека) вказує на останнє значення(слово), яке поміщене в стек. Наприклад, для приведеної нижче програми стек в точці (1) всередині main() може представлений наступним чином:
верхні адреси пам’яті
змінна main() ‘i’
нижні адреси пам’яті
#include<fstream.h>
void func2()
{int l=0x1000L;
//(3) Коли упрвління досягне цієї точки, вказівник стеку вказує на змінну ‘l’;
// якщо рухатись вверх по стеку, то можна знайти:
// обрамлення стека func2()
// адресу повернення в func1()
// адресу повернення в main()
// змінну main() ‘i’
}
void func1()
{ifstream ifs(“STACK.CPP”);
//(2) рухаючись вверх по стеку, коли управління досягло цієї точки
//ми знайдемо:
//локальну змінну ‘ifs’
//обрамлення стека func1()
//адресу повернення в main()
// змінну main() ‘i’
func2();
}
int main(void)
{int i=0x1;
//(1) коли вказівник інструкцій досягне цього місця, вказівник стеку
//вказує на змінну ‘i’, останнє значення , поміщене в стек ...
func1();
return i;
}
В точці (3) всередині функції func2() стек виглядає так:
верхні адреси пам’яті
змінна main() ‘i’
адреса повернення main()
обрамлення стека func1()
змiнна func1() ‘ifs’
адреса повернення func1()
обрамлення стека func2()
змінна func2() ‘l’
нижні адреси пам’яті
Термін “стек викликів” означає послідовність викликаних функцій, які ще не завершилися, в результаті якої управління досягає певної точки програми. Стек викликів всередині func2():
func2()
func1()
main()
13.2 Робота з управлінням виключеннями мови С++