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

Тема 8. Використання шаблонів функцій та класів

  1. Створення шаблону функції та його використання

  2. Оголошення шаблону класів та визначення його методів

Достатньо часто можна записати алгоритм виконання якої-небудь дії незалежно від того, якого типу дані ми обробляємо. Найпростішим прикладом буде визначення максимуму з двох величин.

if (а>b)

х=а;

else х=b;

Незалежно від того, до якого саме типу належать змінні а, b і х, якщо це один і той же тип, для якого визначена операція більше, запис буде одна і та ж. Було б природно визначити функцію max, що повертає максимум з двох своїх аргументів. Виникає питання, як описати аргументи цієї функції? Звичайно, можна визначити max для всіх відомих типів, проте, по-перше, довелося б повторювати один і той же запис багато разів, а по-друге, з додаванням нових класів додавати нові функції.

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

Механізм шаблонів в мові Си++ дозволяє ефективно вирішувати такі і багато подібні задачі.

1 Створення шаблону функції та його використання

Ми познайомимося з двома важливими поняттями мови C++: шаблонами функцій і шаблонами класів. Шаблони дозволяють давати узагальнені, в значенні довільності типів даних, визначення функцій і класів, що використовуються. Тому їх часто називають функціями і класами, що параметризуються. Часто також використовуються терміни шаблонні функції і шаблонні класи.

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

template <class T1 | Т1 ідентифікатор1, class Т2 | Т2 ідентифікатор2,..., class Tn | Тn ідентифікаторn> тип ім’я_функції (список параметрів) { //тіло функції}

За ключовим словом template слідують один або декілька параметрів, вкладених в кутові дужки, розділені між собою комами. Кожний параметр є:

• або ключовим словом class, за яким слідує ім’я типу;

• або ім’ям типа, за яким слідує ідентифікатор.

Для завдання типів даних, що параметризуються, замість ключевого слова class може також використовуватися ключове слово typename. Параметри шаблона, наступні за ключовим слоbom class або typename, називають типами, що параметризуються. Вони інформують компілятор про те, що деякий тип даних використовується в шаблоні як параметр. Параметри шаблона, що складаються з імені типу і наступного за ним ідентифікатора, інформують компілятор про те, що параметром шаблона є константа вказаного типу. У зв’язку з цим такі параметри називаються нетиповими.

Ви можете викликати шаблонну функцію як звичайну; ніякого спеціального синтаксису не вимагається.

Запишемо алгоритм знаходження максимуму двох величин, де як параментра виступає тип цих величин.

template<class T>

const Т& max(const Т& а, const Т& Ь)

{

if (а > Ь)

return а; else

return b; }

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

int x, у, z;

String si, s2, s3;

...

// генерація функції max для класу String

s1 = max(s2, s3);

...

// генерація функції max для типу int

x = max(у, z);

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