Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lab_33.doc
Скачиваний:
7
Добавлен:
16.11.2019
Размер:
88.58 Кб
Скачать

Лабораторна робота № 33

Тема: Шаблони (параметризовані типи).

Мета: вивчити представлення та правила роботи із шаблонами.

Теоретична частина

Використання шаблонів покликане, полегшити процес написання повноцінних програм, де під поняттям "написання" мається на увазі не лише процедура первинного написання коду програми, але і наступний за цим довгий процес відладки, модифікації і супроводу, створеного вами програмного продукту. Чим же шаблони можуть спростити процес написання програм?

Раніше ми дублювали і розмножували частини програм, використовуючи простий, але ефективний засіб - текстовий редактор. Сьогодні С++ пропонує нам досконаліший спосіб дублювання, і ім'я йому - "шаблони".

Найбільш поширеним приводом для дублювання фрагментів програм є необхідність реалізувати деякий новий об'єм коду, аналогічний вже написаному, але змінивши типи даних (наприклад, цілі на цілі довгі). Найчастіше для подібної операції за допомогою програми-редактора повторювали текст програми ще раз і міняли типи даних. Програмуючи на З++, ви могли б скористатися засобами перевизначення (перевантаження) і дати обом функціям одне і теж ім'я. Перевизначення робить текст програми наочнішим, але не позбавляє нас від необхідності повторювати один і той же алгоритм в декількох місцях.

Механізм шаблонів пропонує досконале рішення, що дозволяє відокремити загальний алгоритм від його реалізації стосовно конкретних типів даних. Ви можете скласти текст підпрограми зараз, а використовувані типи уточнювати пізніше. Це можливо, оскільки використовуваний тип даних є в цьому випадку параметром. Шаблони поєднують в собі переваги одноразової підготовки фрагментів програми (аналогічно макрокомандам) і контроль типів, властивий перевизначуваним функціям.

У мові С++ є два типи шаблонів - шаблони функцій і шаблони класів.

Шаблони функцій

Оголошення шаблону функції починається із заголовка, що складається з ключового слова template, за яким йде список параметрів шаблону.

// // Опис шаблону функції

template <class X>

X min (X a, X b)

{ return a<b ? a: b;

}

Ключове слово class в описі шаблону означає тип, ідентифікатор в списку параметрів шаблону X означає ім'я будь-якого типу.

У описі заголовка функції цей же ідентифікатор означає тип повертаного функцією значення і типи параметрів функції.

...

// // Використання шаблону функції

int m = min (1, 2);

...

Екземпляр шаблону функції породжується (генерується) компілятором

int min (int a, int b)

{ return a<b ? a: b;

}

У списку параметрів шаблону слово class може також відноситься до звичайного типу даних. Таким чином, список параметрів шаблону <class T> просто означає, що Т є типом, який буде заданий пізніше. Оскільки Т є параметром, що означає тип, шаблони іноді називають типами, що параметризуються.

Приведемо опис шаблону функції

template <class T>

T toPower (T base, int exponent)

{ T result = base;

if (exponent==0) return #011;

if (exponent<0) return #010;

while (--exponent) result *= base;

return result;

}

Змінна result має тип Т, так що, коли передаване в програму значення є 1 або 0, то воно спочатку приводиться до типу Т, щоб відповідати оголошенню шаблону функції.

Типовий аргумент шаблону функції визначається згідно з типами даних, використовуваних у виклику цієї функції :

int i = toPower (10, 3);

long l = toPower (1000L, 4);

double d = toPower (1e5, 5);

У першому прикладі Т стає типом int, в другому - long. Нарешті, в третьому прикладі Т стає типом double. Наступний приклад приведе до помилки компіляції, оскільки в нім приймаюча змінна і повертане значення мають різні типи:

int i = toPower (1000L, 4);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]