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

37. Что такое шаблоны (или обобщенные функции)? Их назначение?

Шаблон (обобщенные функции) используютсядля создания каркаса функции, оставляя компилятору реализацию подробностей.

Обобщенные функции работаютаналогично обычным функциям, но в отличие от обычных, реализуют необходимый алгоритм без задания конкретных числовых значений.

Используя обобщенные функции, можно создатьфункции-шаблоны и классы-шаблоны, для которых тип данных, которым оперирует эта функция или класс, является параметром, т е. можно использовать одну функцию или класс для нескольких различных типов данных без необходимости явного написания кода для каждой версии в отдельности.

38. Функция-шаблон. Назначение функции-шаблона? Общий вид функции-шаблона?

Функция-шаблонопределяет общий набор операций, который будет применен к данным различных типов.

Например, алгоритм быстрой сортировки совершенно одинаковый и для массива целых чисел, и для массива чисел с плавающей запятой. Отличается только тип данных, подлежащих сортировке.

При помощи создания функции-шаблона можно определить сущность алгоритма безотносительно к типу данных. После этого компилятор автоматически генерирует корректный код для того типа данных, для которого создается данная реализация, т. е. когда создается функция-шаблон, создается функция, которая может автоматически перегружать сама себя.

Функции-шаблоны создаются с использованием ключевого слова template(шаблон).

Общая форма функции-шаблона имеет следующий вид:

template <class параметр-тип> возвращаемый_тип имя_функции (список параметров)

{

. . . //тело функции

}

Где параметр-тип– это "держатель места" для имени типа данных, которое используется функцией. Параметр-тип может быть использован в определении функции. Но этот "держатель места" будет автоматически заменен компилятором на фактический тип данных во время создания конкретной версии функции.

Например, создадим функцию-шаблон, которая имеет два параметра и меняет между собой величины значений этих параметров.

# include <iostream.h>

// Х – шаблон типа, используемый в качестве параметра-типа. Далее объявляется функция

//swap(), использующая тип данных Х для параметров, которые будут обмениваться значениями

template <class Х> void swap (X &a, Х &b)

{

X temp;

temp=a;

a=b;

b=temp;

}

int main()

{

int i=10, j=20;

float x=10.1, y=23.3;

char a='x', b='z';

cout<<"Первоначальные значения i, j: "<<i<<" "<<j<<endl;

cout<<" Первоначальные значения x, y: "<<x<<" "<<y<<endl;

cout<<" Первоначальные значения a, b: "<<a<<" "<<b<<endl;

swap(i, j);

swap(x, y);

swap(a, b);

cout<<"Измененные значения i, j: "<<i<<" "<<j<<endl;

cout<<" Измененные значения x, y: "<<x<<" "<<y<<endl;

cout<<" Измененные значения a, b: "<<a<<" "<<b<<endl;

return 0;

}

Функция swap() одинаково успешно будет работать для различных типов данных: целых чисел, чисел с плавающей точкой и символов.

Можно определить несколько типов-шаблонов данных в инструкции template, перечислив их через запятую.

Например, рассмотрим программу, реализующую переопределение функции maxдля аргументов различных типов, с использованием функции-шаблона:

#include<iostream.h>

#include<conio.h>

template <class Type1, class Type2> Type1 max(Type1 x, Type2 y)

{

return (x>y)?x:y;

}

// по шаблону типы аргументов должны быть одинаковыми,

// поэтому, для вариантов max(int, char) и max(char, int)

// нужно явно описать необходимые преобразования типов

char max(char, char);

void main(void)

{

int a=1, b=2;

char c='9', d='A';

clrscr();

cout<<max(a,b)<<" "<<max(c,d)<<" "<<max(a,c)<<" "<<max(c,b);

}