- •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.5 Робота з специфікаціями виключень
Можна задавати список виключень, які функція може викидати, за допомогою специфікації виключень, що приєднується до заголовка функції. Специфікація має наступний формат:
throw( тип, тип, ...)
Специфікація виключень без типа вказує, що функція не повинна викидати ніяких виключень. Функції без специфікацій навпаки можуть викидати будь-які виключення. Приклад:
struct xClass{
int i;}
void funcA(void) throw(int)
{ }
void funcB(void) throw(long,xClass*)
{ }
void funcC(void) throw()
{ }
13.2.6 Робота з непередбаченими виключеннями
Спеціфікації виключень, власне кажучи, ні до чого не зобов’язують. Тобто функція може прямо чи викинути виключення, яке вона обіцяла не використовувати. При компіляції ніякої помилки не буде:
void func(void) throw(int)
{
throw ”Ой!”;
}
Порушення списку допустимих виключень виявляється тільки під час виконання. Непередбачене виключення приводить до виклику функції unexpected(). По замовчуванню unexpected() просто викликає функцію terminate(). Однак за допомогою функції set_unexpected() можна встановити свою власну процедуру, яка буде викликатись в момент викиду неспецифікованого виключення. Функція set_unexpected() визначена в файлі EXCEPT.H:
typedef void(_RTLENTRY *unexpected function)();
// . . .
unexpected_function _RTLENTRY
set_unexpected(unexpected_function);
Функція повертає адресу попередньої процедури для непередбачених виключень. Ваша процедура не може повертати управління чи викидати виключення.
13.2.7 Робота з конструкторами та виключеннями
Розглянемо ситуацію, коли виключення прямо чи непрямо викидається конструктором. При виникненні виключення деструктори викликаються лише для повністю сконструйованих локальних об’єктів.
#include<iostream.h>
#include<except.h>
class TDataClass
{public:
TDataClass()
{
cout<<“ TDataClass:: TDataClass()”<<endl;
}
~TDataClass()
{
cout<<“ TDataClass:: ~TDataClass()”<<endl;
}
};
class TBaseClass
{public:
TBaseClass()
{cout<<“ TBaseClass:: TBaseClass()”<<endl;
}
~TBaseClass()
{cout<<“ TBaseClass:: ~TBaseClass()”<<endl;
}
};
class TDerivedClass:public TBaseClass
{ TDataClass data;
public:
TDerivedClass()
{ cout<< “TDerivedClass:: TDerivedClass()”<<endl;
cout<<“викидається виключення”<<endl;
trow “Ой! Щось сталося”;
}
~TDerivedClass()
{ cout<< “TDerivedClass::~ TDerivedClass()”<<endl;}
};
int main(void)
{
try{ TDerivedClass tds;
//. . .
}
catch(const char*msg)
{
cout<<“впіймолось виключення”<<msg<<endl;
return -1;
}
return 0;
}
Результати роботи програми:
TBaseClass:: TBaseClass()
TDataClass:: TDataClass()
TDerivedClass::TDerivedClass()
викидаємо виключення
TDataClass:: ~TDataClass()
TDerivedClass::~ TDerivedClass()
впіймолось виключення: Ой! Щось сталося
Щоб управління виключеннями С++ приносило вигоду, необхідно запакувати ініціалізацію та очистку деякого ресурса відповідно в конструктор та деструктор класу і при виділенні ресурса створювати локальні екземпляри цього класу. Якщо конструктор класу виділяє ресурси кількох типів чи виконує код, який може викинути виключення після того, як ресурс виділений, рекомендується помістити кожен ресурс у свій власний клас. Таким чином, кожен ресурс завжди буде локалізованим у повністю зконструйованому класі.
