Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
+ООП_Навч_посібник.doc
Скачиваний:
7
Добавлен:
01.07.2025
Размер:
6.58 Mб
Скачать

17.2.6. Безпосередньо задані спеціалізації класів

Подібно до шаблонних функцій можна створювати і спеціалізації узагальнених класів. Для цього використовується конструкція template<>, яка працює за аналогією із безпосередньо заданими спеціалізаціями функцій. Розглянемо такий приклад.

Код програми 17.11. Демонстрація безпосередньо заданої спеціалізації класів

#include <vcl>

#include <iostream> // Для потокового введення-виведення

#include <conio> // Для консольного режиму роботи

using namespace std; // Використання стандартного простору імен

template <class tType> class myClass { // Оголошення класового типу

tType x;

public:

myClass(tType a_ob){

cout << "У тілі узагальненого класу myClass.\n";

x = a_ob;

}

tType getXzm() { return x;}

};

// Безпосередня спеціалізація для типу int.

template <> class myClass<int> {

int x;

public:

myClass(int a) {

cout << "У тілі спеціалізації myClass<int>.\n";

x = a * a;

}

int getXzm() { return x;}

};

int main()

{

myClass<double> D_ob(10.1);

cout << "double: " << D_ob.getXzm() << "\n\n";

myClass<int> I_ob(5);

cout << "int: " << I_ob.getXzm() << "\n";

getch(); return 0;

}

У процесі виконання ця програма відображає на екрані такі результати:

У тілі узагальненого класу myClass.

double: 10.1

У тілі спеціалізації myClass<int>.

int: 25

У цій програмі зверніть особливу увагу на такий рядок:

template <> class myClass<int> {

Він повідомляє компіляторові про те, що створюється безпосередня int-спеціалізація класу myClass. Аналогічний синтаксис використовується і для будь-якого іншого типу спеціалізації класу.

Безпосередня спеціалізація класів розширює діапазон застосування узагальнених класів, оскільки вона дає змогу легко обробляти один або два спеціальні випадки, залишаючи всю решту варіантів для автоматичного оброблення компілятором. Але, якщо Ви побачите, що у Вас створюється дуже багато спеціалізацій, то тоді, можливо, краще взагалі відмовитися від створення шаблонного класу.

Розділ 18. Оброблення виняткових ситуацій

Цей розділ присвячений обробленню виняткових ситуацій. Виняткова ситуація (або винятки) – це помилка, яка виникає у процесі виконання програми. Використовуючи С++-подсистему оброблення виняткових ситуацій, з такими помилками цілком можна справлятися. При їх виникненні під час роботи програми автоматично викликається так званий обробник винятків. Тепер програміст не повинен забезпечувати перевірку результату виконання кожної конкретної операції або функції вручну. У цьому-то і полягає принципова перевага системи оброблення винятків, оскільки саме вона "відповідає" за програмний код оброблення помилок, який раніше доводилося "вручну" вводити в і без того об'ємні програми.

У цьому розділі ми також повертаємося до С++-операторів динамічного розподілу пам'яті: new і delete. Як пояснювалося вище у цьому навчальному посібнику, якщо оператор new не може виділити необхідну пам'ять, він генерує винятки. І тут ми дізнаємося про те, як саме обробляються такі винятки. Окрім того, Ви навчитеся перевантажувати оператори new і delete, що дасть змогу Вам визначати власні схеми виділення пам'яті.