Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛЕКЦИИ Программирование и основы алгоритмизации...doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.5 Mб
Скачать

Перегрузка функций

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

int max(int,int); //возвращает наибольшее из двух чисел

char* max(char*, char*); //возвращает подстроку наибольшей

//длины

int max(int, char*); //возвращает наибольшее из первого параметра

//и длины второго

int max(char*,int); //возвращает наибольшее из второго параметра

//и длины первого

void f(int a, int b, char* c, char* d)

{cout<<max(a,b)<<max(c,d)<<max(a,c)<<max(d,b);}

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

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

template <class T>

T maximum (T a, T b, T c)

{ T max=a;

if(b>max) max=b;

if(c>max) max=c;

return max;

}

В <> находится список формальных типов параметров функции. Здесь же могут быть и просто переменные.

template <class A, class B, int i, char ch>

void f()

{………..}

Формальные типы – это стандартные или пользовательские типы.

При вызове шаблоны преобразуются в функции, которые затем выполняются.

int i1, i2, i3;

cin>>i1>>i2>>i3;

cout<<maximum(i1, i2, i3);

double d1, d2, d3;

cin>>d1>>d2>>d3;

cout<<maximum(d1, d2, d3);

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

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

Указатели на функции

void f(int a) {……..} //определение функции

void (*pf)(int); //объявление указателя pf на функцию

Чтобы выделить объявление указателя, используют переопределение типа с помощью ключевого слова typedef:

typedef void(*pf)(int); // здесь *pf определяется как новое имя

// (синоним) функции f.

Указателю на функцию можно присвоить адрес функции:

pf=&f; //но можно и так: pf=f; так как имя функции является указателем.

Вызов функции через указатель: pf(10); можно и так: (*pf)(10);

Объявление и инициализация массива указателей на функции:

pf menu[]={&new, &open, &save};

new, open, saveимена ранее объявленных функций.

menu[2](5); - вызов функции save.

Передача в функцию указателя на функцию осуществляется так же, как и передача параметров других типов.

#include <iostream.h>

typedef void (*pf) (int);

void f1(pf ptr) // f1 имеет в качестве параметра указатель ptr типа pf

{ptr(5);} //вызов функции, переданной через указатель

void f(int i) {cout<<i;}

void main()

{f1(f); //5 //имя функции f используется в качестве фактического

//параметра функции f1

}

Примечание. Тип указателя и тип функции, которая вызывается через этот указатель, должны совпадать в точности.

Указатель на функцию как возвращаемое функцией значение

Такой указатель используется для организации меню в случаях, когда количество вариантов определяется не в точке исполнения, а в «промежуточной» функции. Из этой «промежуточной» функции возвращают в виде указателя на функцию адрес той конкретной функции, которая должна быть выполнена.

#include <iostream.h>

#include <conio.h>

int f1() {cout<<”действие 1:”; return 1;}

int f2() {cout<<”действие 2:”; return 2;}

int (*menu())() //функция menu() возвращает указатель на функцию

{ int k;

int(*menuptr[])()={f1, f2}; //массив указателей на функции

cout<<”\nВведите пункт меню (1/2):”;

cin>>k;

if(k<3&&k>0) return menuptr[k-1];

else return 0;

}

void main()

{ int(*r)(); //объявление указателя на функцию

int t;

while(1)

{ r=menu(); //обращение к меню

if(r==0) { cout<<”\nКонец!”;

getch();

return;

}

t=(*r)();

cout<<t;

}

}

Результат:

Введите пункт меню (1/2):1

действие 1:1

Введите пункт меню (1/2):2

действие 2:2

Введите пункт меню (1/2):5

Конец!