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

Void main()

{int S1=sum(10); // 20 или 15

… }

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

Для автоматизации создания функций различного вида (в т.ч. и перегруженных) в С++ введены шаблоны функций. Определяется шаблон семейства функций следующим образом

template <class type1,class type2, class type3 …>

где type1, type2, type3. – формальные параметры шаблона, которыми можно обозначать тип возвращаемого значения, типы формальных и локальных параметров внутри функции.

Пример.

template <class Tip>

Tip max(Tip x, Tip y )

{if(x>y)return x;

return y;}

Int main()

{int a1=-7,a2=40,res1; float f1=-3.6,f2=-10.5,res2;

res1=max(a1,a2);

res2=max(f1,f2);

printf("res1=%d res2=%.1f\n",res1,res2);

//res1=40 res2=-3.6

return 0;}

При компиляции программы с шаблоном функции, компилятор при вызове функции доопределяет ее. В данном примере при вызове res1=max(a1,a2); сформируется определение int max(int x,int y) и вызовется именно эта функция. При вызове функции res2=max(f1,f2); сформируется определение float max(float x,float y) и теперь вызываться будет данная функция.

Свойства параметров шаблонов:

  1. Имена параметров шаблона должны быть уникальными во всем определении шаблона;

  2. Список параметров шаблона не может быть пустым;

  3. Объявление каждого параметра должно начинаться со слова class;

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

  5. Все параметры шаблона, используемыев определении функции, должны быть обязательно использованы в сигнатуре функции. Т.е. недопустимо, например, определение

template <class A,class B>

B func(A x){…} // Ошибка, параметр В не использован

// в спецификации формальных параметров

Шаблон функции может быть использован и при описании прототипа функции.

template <class A>

Void func(a);

Пример. Функция меняет местами значение объектов

#include <stdio.h>

template <class A>

void swp(A *x,A *y) // указатель типа А

{A z=*x; // Шаблон использован в теле функции

*x=*y; *y=z;}

Int main()

{double d1=3.3, d2=2.2; swp(&d1,&d2);

printf("d1_n=%.2lf d2_n=%.2lf\n",d1,d2);

//d1_n=2.20 d1_n=3.30

char c1='M', c2='Z'; swp(&c1,&c2);

printf("c1_n=%c c2_n=%c\n",c1,c2);//c1_n=Z c2_n=M

char *st1="Весна", *st2="Лето"; swp(&st1,&st2);

printf("st1_n=%s st2_n=%s\n",st1,st2);

//st1_n=Лето st1_n=Весна

swp(st1,st2);

printf("st1_nn=%s st2_nn=%s\n",st1,st2);

// st1_nn=Вето st1_nn=Лесна

return 0;}

В этом примере компилятор сформирует следующие определения к функциям:

void swp(double *x,double*y), void swp(char*x,char*y),

void swp(char**x,char**y), void swp(char*x,char*y).

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

Пример. Функция определяет индекс максимального элемента

template <class T>

int func_max(T x[], int n)

{T m=x[0]; int k=0;

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

if(x[i]>max){max=x[i]; k=i;}

return k;}

void main()

{int arr[5]={5,12,40,23,4}, in1, in2;

in1=func_max(arr,5); //in1=2

printf("max1=arr[%d]=%d\n",in1,arr[in1]);

float mas[4]={5.3,1.2,4.0,20.3};

in2=func_max(mas,4); //in2=3

printf("max2=mas[%d]=%.2f\n",in2,arr[in2]);}

В результате работы программы на экран выведется:

max1=arr[2]=40 max2=mas[3]=20.30

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