STUD f2(STUD b,STUD с)

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>


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: