Void f1(STUD a)
{strcpy(a.name,"Петров"); // Копируем в a.name "Петров"
a.age+=1;
printf("%s %d\n",a.name,a.age); } // Петров 20
{if(b.age>с.age) return b;
// возвращаем ту структуру, в которой age больше
return с;}
void f3(STUD *p)
{strcpy(p->name,"Сидоров");
p->age=21;
printf("%s %d\n", p->name, p->age);} // Сидоров 21
STUD *f4(STUD *r1,STUD *r2)
{if(r1->age>r2->age) return r1;
// возвращаем указатель на ту структуру, в которой age больше
return r2;}
void main()
{STUD st1={"Иванов",19},st2={"Орлов",22},st3;
f1(st1);
printf("%s %d\n",st1.name,st1.age);// все равно Иванов 19
st3=f2(st1,st2);
printf("%s %d\n",st3.name,st3.age); // Орлов 22
STUD st4={"Сергеев",18},st5={"Алешин",25},*pst;
f3(&st4);
printf("%s %d\n",st4.name,st4.age); // Сидоров 21
pst=f4(&st4,&st5);
printf("%s %d\n",pst->name,pst->age);} // Алешин 25
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;}
void main()
{int a1=3,a2=4,a3; long b1=20,b2=400,b3;
float d1=5.5,d2=7.5,d3;
a3=FF(a1,a2);
b3=FF(b1,b2);
d3=FF(d1,d2);
printf("a3=%d b3=%ld d3=%.2f\n", a3,b3,d3);}
В результате работы программы на экран выведется:
a3=25 b3=160400 d3=86.50
Пример. Функции различаются по количеству передаваемых в них параметров.
#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;}
void main()
{double M1=mul(0.2);
double M2=mul(0.2,0.4);
double M3=mul(0.2,0.3,0.4);
printf("M1=%.4lf M2=%.4lf M3=%.4lf\n", M1,M2,M3);}
В результате работы программы на экран выведется:
M1=0.0080 M2=0.0322 M3=0.0240
При определении функции с одинаковой сигнатурой, но с другим телом и типом возвращаемого значения, компилятор сообщит об ошибке, т.к. функция с такой сигнатурой уже определена. Например, если в данном примере доопределить следующую функцию, то появится сообщение об ошибке:
int mul(double x,double y)
{if (x>y)return 1; else return 2;}
При использовании перегруженных функций желательно н е пользоваться умалчиваемыми параметрами. Если определить несколько перегруженных функций с умалчиваемыми параметрами, то может выдаваться сообщение о неоднозначности:
Пример.
#include <stdio.h>
int sum(int x) {return 2*x;}
int sum(int x, int y=5) {return x+y;}
void main()
{int S1=sum(10); // 20 или 15
… }
2.11 Шаблоны функций
Для автоматизации создания функций различного вида (в т.ч. и перегруженных) в С++ введены шаблоны функций. Определяется шаблон семейства функций следующим образом
|
|
template <class type1,class type2, class type3 …>
где type1, type2, type3. – формальные параметры шаблона, которыми можно обозначать тип возвращаемого значения, типы формальных и локальных параметров внутри функции.
Пример.
template <class Tip>