Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика_и_Пр_Бизнес_лекции.doc
Скачиваний:
85
Добавлен:
10.05.2015
Размер:
1.21 Mб
Скачать

8.6. Шаблон функции

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

Назначение шаблона:

  • автоматическое создание перегруженных функций;

  • уменьшение размера исходного кода программы.

Шаблон следует использовать в тех случаях, когда в программе используется один и тот же алгоритм для разных типов данных и запись этого алгоритма на языке С++ одинакова.

Синтаксис определения шаблона функции:

template <class имя1, class имя2, …,class имяn>

заголовок функции

{тело функции}

Синтаксис прототипа шаблона функции:

template <class имя1, class имя2, …,class имяn>

заголовок функции;

где имя1, имя2, …,имяn… - имена параметрических типов шаблона, настраиваемых на конкретный тип аргумента при вызове функции.

Параметрический тип может использоваться в шаблоне функции для объявления:

  • типа формального параметра функции;

  • типа возвращаемого функцией значения;

  • типа локальной переменной.

Все параметрические типы, введенные в шаблоне, должны обязательно использоваться в формальных параметрах шаблона. Использование параметрического типа только для локальных переменных и /или для возвращаемого шаблоном значения недостаточно.

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

#include <iostream.h>

#include <conio.h>

//Прототипы шаблонов функций

template <class t>

void input (t a[], int n);

template <class t>

void output (t a[], int n);

template <class t>

void del (t a[], int &n, t x);

void main()

{

int a[100], b[100];

float c[100];

int n; //количество чисел в массиве

int xi; //значение удаляемых из целочисленного массива чисел

float xf; //значение удаляемых из вещественного массива чисел

cout<<”n_int? ”;

cin>>n;

input(a,n);

output(a,n); //вывод исходного массива

cout<<”x_int? ”;

cin>>xi;

del (a,n, xi);

output(a,n); //вывод массива после удаления из него чисел

cout<<”n_int? ”;

cin>>n;

input(b,n);

output(b,n); //вывод исходного массива

cout<<”x_int? ”;

cin>>xi;

del (b,n, xi);

output(b,n); //вывод массива после удаления из него чисел cout<<”n_float? ”;

cin>>n;

input(c,n);

output(c,n); //вывод исходного массива

cout<<”x_float? ”;

cin>>xf;

del (c,n, xf);

output(c,n); //вывод массива после удаления из него чисел

getch();

}

//Определения шаблонов функций

template <class t>

void input (t a[], int n)

{

cout<<”array: “;

for (int=0; i<n; i++)

cin>>a[i];

}

template <class t>

void output (t a[], int n)

{

if (n==0)

cout<<” array is empty”<<endl;

else

{

for (int i=0; i<n; i++)

cout<<a[i]<<” “;

cout<<endl;

}

}

template <class t>

void del (t a[], int &n, t x)

{

int i, j;

j=0;

for (i=0; i<n; i++)

if (a[i]!=x)

{ a[j]=a[i]; j++;}

n=j;

}

Первый вызов функции, например, input(a,n), приводит к созданию варианта функции ввода целочисленного массива. При повторном вызове функции с теми же типами фактических параметров, которые встречались ранее, например, input(b,n), компилятор не создает повторно код функции ввода массива целых чисел.

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

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

#include <iostream.h>

#include <conio.h>

//Определение шаблона функции ввода массива

template <class t>

void input (t a[], int n)

{

cout<<”array int “;

for (int=0; i<n; i++)

cin>>a[i];

}

//Определение шаблона функции вычисления среднего

template <class t>

float avg (t a[], int n)

{

t s=0; // параметрический тип для локальной переменной

for (int i=0; i<n; i++)

s+=a[i];

return (float)s/n;

}

void main()

{

int b[100];

float c[100];

int n;

cout<<”n_b? ”; cin>>n;

input(b,n);

cout<<”avg_b=”<<avg (b,n) <<endl;

cout<<”n_c? ”; cin>>n;

input(c,n);

cout<<”avgb=”<<avg (c,n) <<endl;

cout<<”avgb=”<<avg (b,5);

getch();

}