2.10 Перегруженные функции и шаблоны функций
Перегруженные функции – это функции, которые имеют одинаковое имя, но различаются по типам и по количеству передаваемых в них параметров.
Распознавание перегруженных функций при вызове выполняется только по сигнатурам (списку формальных параметров функции). Для обеспечения перегрузки необходимо для каждого имени определить, сколько разных функций связано с ним.
Пример 2.10
#include <stdio.h> |
int FF(int x,int y) {return x*x+y*y;} |
long FF(long x, long y) {return x*x+y*y;} |
float FF(float x, float y) {return x*x+y*y;} |
int main() |
{int a1=3,a2=4,a3; |
a3=FF(a1,a2); |
long b1=20,b2=400,b3; |
b3=FF(b1,b2); |
float d1=5.5,d2=7.5,d3; |
d3=FF(d1,d2); |
printf("a3=%d b3=%ld d3=%.2f\n", a3,b3,d3); |
return 0;} |
|
|
Пример 2.11
#include <stdio.h> |
double mul(double x) |
{return x*x*x;} |
double mul(double x,double y) |
{return x*y*y;} |
double mul(double x,double y,double z) |
{return x*y*z;} |
int main() |
{double M1=mul(0.2); |
double M2=mul(0.2,0.4); |
double M3=mul(0.2,0.3,0.4); |
printf("M1=%.2lf M2=%.2lf M3=%.2lf\n", M1,M2,M3); |
return 0; } |
|
Для автоматизации создания функций различного вида (в т.ч. и перегруженных) в С++ введены шаблоны функций. Определяется шаблон семейства функций следующим образом
template <class type1,class type2, class type3 …>
где type1, type2, type3. – формальные параметры шаблона, которыми можно обозначать тип возвращаемого значения, типы формальных и локальных параметров внутри функции.
При компиляции программы с шаблоном функции, компилятор при вызове функции доопределяет ее (создает перегруженные функции).
Свойства параметров шаблонов:
Имена параметров шаблона должны быть уникальными во всем определении шаблона;
Список параметров шаблона не может быть пустым;
Объявление каждого параметра должно начинаться со слова class;
Имя параметра шаблона имеет свойства и права типа, т.е. его именем можно называть типы формальных параметров, тип функции, типы локальных переменные функции. Область видимости параметра шаблона во всем определении функции;
Все параметры шаблона, используемыев определении функции, должны быть обязательно использованы в сигнатуре функции. Т.е. недопустимо, например, определение
template <class A,class B>
B func(A x){…} // Ошибка, параметр В не использован
// в спецификации формальных параметров
Пример 2.12
template <class Tip> |
Tip max(Tip x, Tip y ) |
{if(x>y)return x; |
return y;} |
int main() |
{int a1=-7, a2=40,res1; |
res1=max(a1,a2); |
float f1=-3.6,f2=-10.5,res2; |
res2=max(f1,f2); |
printf("res1=%d res2=%.1f\n",res1,res2); |
return 0; } |
|
|
Функция, содержащая параметры, определяемые в шаблоне, может содержать любое количество не параметризованных формальных параметров и возвращать не параметризованное значение.
Пример 2.13
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;} |
int main() |
{int arr[5]={5,12,40,23,4}, in1, in2; |
in1=func_max(arr,5); |
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); |
printf(“max2=mas[%d]=%.2f\n”,in2,arr[in2]); |
return 0;} |
|
