Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

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

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

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

template <class имя_типа [,class имя_типа]>

заголовок_функции

{тело функции}

Таким образом, шаблон семейства функций состоит из 2 частей – заголовка шаблона: template<список параметров шаблона> и обыкновенного определения функции, в котором вместо типа возвращаемого значения и/или типа параметров, записывается имя типа, определенное в заголовке шаблона.

Пример 1.

//шаблон функции, которая находит абсолютное значение числа любого типа

template<class type>//type – имя параметризируемого типа

type abs(type x)

{

if(x<0)return -x;

else return x;

}

Шаблон служит для автоматического формирования конкретных описаний функций по тем вызовам, которые компилятор обнаруживает в программе. Например, если в программе вызов функции осуществляется как abs(-1.5), то компилятор сформирует определение функции double abs(double x){... }.

 

Пример 2.

//шаблон функции, которая меняет местами две переменных

template <class T>//T – имя параметризируемого типа

void change(T*x,T*y)

{T z=*x;*x=*y;*y=z;}

Вызов этой функции может быть:

long k=10,l=5;

change(&k,&l);

Компилятор сформирует определение:

void change(long*x,long*y){ long z=*x;*x=*y;*y=z;}

 

Пример 3.

#include<iostream.h>

template<class Data>

Data&rmax(int n,Data a[])

{

int im=0;

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

if(a[im]<a[im])im=i;

return d[im];//возвращает ссылку на максимальный элемент в массиве

}

void main()

{int n=5;

int x[]={10,20,30,15};

cout<<”\nrmax(n,x)=”<<rmax(n,x)<<”\n”;

rmax(n,x)=0;

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

cout<<x[i]<<” “;

cout<<”\n”;

float y[]={10.4,20.2,30.6,15.5};

cout<<”\nrmax(n,y)=”<<rmax(n,y)<<”\n”;

rmax(4,y)=0;

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

cout<<y[i]<<” “;

cout<<”\n”;

}

Результаты:

rmax(n,x)=30

10 20 0 15

rmax(n,y)=30.6

10.4 20.2 0 15.5

Основные свойства параметров шаблона функций

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

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

3. В списке параметров шаблона может быть несколько параметров, каждый из них начинается со слова class.

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

тип_функции(*имя_указателя)(спецификация параметров)

Примеры:

1. int f1(char c){.... }//определение функции

int(*ptrf1)(char);//определение указателя на функцию f1

2. char*f2(int k,char c){....}//определение функции

char*ptrf2(int,char);//определение указателя

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

Вызов функции с помощью указателя имеет вид:

(*имя_указателя)(список фактических параметров);

Пример.

#include <iostream.h>

void f1()

{cout<<”\nfunction f1”;}

void f2()

{cout<<”\nfunction f2”;}

void main()

{

void(*ptr)();//указатель на функцию

ptr=f2;//указателю присваивается адрес функции f2

(*ptr)();//вызов функции f2

ptr=f1;//указателю присваивается адрес функции f1

(*ptr)();//вызов функции f1с помощью указателя

}

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

void (*ptr)()=f1;

Указатели н функции могут быть объединены в массивы. Например, float(*ptrMas[4])(char) – описание массива, который содержит 4 указателя на функции. Каждая функция имеет параметр типа char и возвращает значение типа float. Обратиться к такой функции можно следующим образом:

float a=(*ptrMas[1])(‘f’);//обращение ко второй функции

Пример.

#include <iostream.h>

#include <stdlib.h>

void f1()

{cout<<"\nThe end of work";exit(0);}

void f2()

{cout<<"\nThe work #1";}

void f3()

{cout<<"\nThe work #2";}

void main()

{

void(*fptr[])()={f1,f2,f3};

int n;

while(1)//бесконечный цикл

{

cout<<"\n Enter the number";

cin>>n;

fptr[n]();//вызов функции с номером n

}

}

<== предыдущая лекция | следующая лекция ==>
Перегрузка функций | Структуры
Поделиться с друзьями:


Дата добавления: 2014-01-04; Просмотров: 197; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.015 сек.