>
Тут кутові дужки є невід'ємним елементом визначення. Список параметрів шаблону повинен бути укладений саме в кутові дужки.
Список аргументів полягає з виразів типу
class ідентифікатор n>
ідентифікатор 1, ідентифікатор n являють собою позначення параметрезованих типів. Ці позначення типів можна використовувати замість типів формальних параметрів або локальних змінних.
Під класом в даному випадку розуміється самий великий тип даних.
Наприклад, шаблон функції обміну для масиву буде виглядати так:
template
void Obmen (T A [], int i, int j)
{T temp;
temp = A [i];
A [i] = A [j];
A [j] = temp;}
main ()
{int Z [10];
...
Obmen (Z, 5,7);
float x [100];
Obmen (x, 6,7);
...
}
Шаблони функцій можна спеціалізувати, тобто для типів даних, до яких не підходить шаблон, визначити функцію з таким же ім'ям. У цьому випадку алгоритм звернення компілятора до функції буде наступним:
1) Компілятор намагається знайти функцію, параметри якої точно відповідають параметрам виклику.
Якщо це не вдалося, то
2) компілятор намагається знайти шаблон, з якого можна згенерувати функцію з вказаними параметрами.
Якщо і це не вдалося, то
3) компілятор розглядає наявні функції на предмет перетворення типів параметрів.
Шаблони класів
Шаблони класів задають узагальнені визначення родин класів, що використовують довільні типи і константи. Із шаблона класу компілятор може генерувати об'єкти з певними типами і константами.
template <список аргументів>
class NameClass
{ ... }
Список аргументів полягає в загальному випадку з конструкцій
class Ід n,
тип Ід k ...>
Ідентифікатори Ід 1 - Ід n використовуються при визначенні параметрезованих типів.
Ідентифікатор Ід k використовується для завдання констант.
Об'єкти шаблонного класу створюються таким чином:
NameClass A (Список ініціалізації)
Буде створений об'єкт, де формальні типи будуть замінені типом int. Список аргументів модифікується в такий спосіб: аргументи виду class Ідентифікатор замінюється конкретним типом (int, double і т.д.), у тому числі тут можна використовувати і класи.
Аргумент виду тип Ідентифікатор замінюється відповідною константою. p> Шаблони класів специфікувати не можна.
Приклад використання шаблонів класу:
template
class TSteck
{int n; T * item;
public:
TSteck (int S = 10)
{n = 0; item = new T [S];}
void push (T t);
T pop ();
}
template
void TSteck :: push (T t)
{item [n + +] = t;}
T TSteck :: pop ()
{return item [n -];}
TSteck A (100);// Створення об'єкта
Буде викликаний конструктор, і буде моделюватися масив, що імітує стек.
6. Обробка виняткових ситуацій у C + +
C + + забезпечує вбудований механізм обробки помилок, званий обробкою виняткових ситуацій. Він дозволяє обробляти тільки синхронні виняткові ситуації, тобто ті ситуації, виникнення яких в явному вигляді передбачено у програмі. Асинхронні виключення (помилки обладнання, апаратні переривання) їм не обробляються.
Для обробки виняткових ситуацій введені три ключові слова:
try, catch, throw. Ці ключові слова використовуються для попередження аварійного виходу з програми і коректної очищення пам'яті.
try служить для позначення секції коду, яка може генерувати виключення, тобто кількох "підозрілих" операторів, в яких можливе виникнення виняткової ситуації (наприклад, ділення на нуль, переповнення і т.д.).
Оператори, включені до фігурні дужки за ключовим словом try, належать до try-блоку. Всі функції прямо чи опосередковано викликаються з try-блоку також належать до нього. br/>
main ()
{...
try {
f1 ();
f2 ();}
...}
f1 і f2 можуть у свою чергу викликати інші функції. Ці функції також належать до try-блоку (вони також можуть генерувати виключення).
Інструкції catch повинні слідувати безпосередньо за try-блоком. Вони являють собою секцію коду, на яку передається керування у разі виникнення винятки. Їх може бути багато. br/>
catch (int i)// перехоплення помилки
{cout <<"перехоплена помилка номер:";
cout <
}
catch-обробник буде спрацьовувати при викиді винятку цілого типу.
Останнім пишеться обробник з трьома крапками:
c...