АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Указатели на функции. Функцию можно вызвать через указатель на нее

Читайте также:
  1. II. Основные задачи и функции Отдела по делам молодежи
  2. III. ФУНКЦИИ ДЕЙСТВУЮЩИХ ЛИЦ
  3. III. Функции семьи
  4. IV. Порядок и формы контроля за исполнением государственной функции
  5. Wait функции
  6. XІІ. СИГНАЛЫ ТРЕВОГИ И СПЕЦИАЛЬНЫЕ УКАЗАТЕЛИ
  7. Абсолютные и относительные ссылки. Стандартные формулы и функции. Логические функции
  8. Акцентная структура слова в русском языке. Система акцентных противопоставлений. Функции словесного ударения.
  9. Акцентная структура слова в русском языке. Функции словесного ударения.
  10. Алгоритм нахождения глобального экстремума функции
  11. Аппарат государства – это система государственных органов, обладающих государственной властью и осуществляющих функции государства.
  12. Аргументы функции main(): argv и argc

Функцию можно вызвать через указатель на нее. Для этого объявляется указатель соответствующего типа и ему с помощью операции взятия адреса присваивается адрес функции:

 

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

 

Например: int (*func1Ptr) (char); - определение указателя func1Ptr на функцию с параметром типа char, возвращающую значение типа int.

Если приведенную синтаксическую конструкцию записать без первых круглых скобок, т.е. в виде int *fun (char); то компилятор воспримет ее как прототип некой функции с именем fun и параметром типа char, возвращающей значение указателя типа int *.

Второй пример: char * (*func2Ptr) (char *,int); - определение указателя func2Ptr на функцию с параметрами типа указатель на char и типа int, возвращающую значение типа указатель на char.

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

 

#include <iostream.h>

#include <conio.h>

#include <math.h>

float degr(double x)

{return M_PI*x/180;}

double in(void)

{double ang;

cout << "\nEnter angle in degrees:";

cin >> ang;

return ang;}

void main()

{ double (*ptr1)(void);

double (*ptr2)(double);

float (*ptr3)(double);

ptr1=in;

ptr2=cos;

ptr3=degr;

cout << "Cos=" << ptr2(ptr3(ptr1()));

getche();}

 

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

При определении функций в своих программах вы должны указать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. Например, если есть функция, работающая с двумя целыми значениями, то при необходимости использовать подобную функцию для трех целых значений, нужно создать функцию с другим именем. Аналогично если нужно использовать подобную функцию для сложения значений типа float, то необходима еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется перегрузкой.

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

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

 

#include <iostream.h>

#include <conio.h>

 

int adder (int iarray[]);

float adder (float farray []);

int main()

{int iarray[7] = {5,1, 6, 20,15,0, 12};

float farray[7] = {3.3,5.2,0.05,1.49,3.12345,31.0,2.007};

int isum;

float fsum;

isum = adder(iarray);

fsum= adder(farray);

cout<< "Сумма массива целых чисел равна " << isum << "\n";

cout<< "Сумма массива дробных чисел равна " << fsum << "\n";

getche();

return (0);}

 

int adder(int iarray[])

{int i, ipartial = iarray[0];

for(i= 1; i < 7; i++) ipartial += iarray[i];

return(ipartial);}

 

float adder (float farray[])

{int i;

float fpartial = farray [0];

for(i= 1; i < 7; i++) fpartial += farray[i];

return (fpartial);}

 

 

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

 

Шаблон функции - позволяет запрограммировать нужный нам алгоритм при этом не отталкиваясь от какого-то типа данных, то есть мы создаем функцию, которой все равно работать с типом double или int.

Синтаксис определения функции:

 

template <class идентификатор_типа>

идентификатор_типа имя_функции (идентификатор_типа параметр1,

идентификатор_типа параметр2,

тип параметр3, …)

 

Пример: функция возведения суммы чисел x и y в степень n

#include <iostream>

#include <conio.h>

#include <math.h>

 

template <class Type> Type st(Type x, Type y, int n)

{Type z;

z=pow((x+y),n);

return z;}

 

void main()

{cout << "(2.4+2.6)^2=" << st(2.4,2.6,2)<< "\n";

cout << "(2+2.5)^2=" << st(2,2.5,2)<< "\n";

cout << "(0.4+1.6)^10=" << st(0.4,1.6,10);

getche();}

 

Вместо использования какого-то определённого типа, в функции используется параметрический тип (или аргумент шаблона). В примере параметрический тип обозначен идентификатором Type. В функции этот идентификатор встречается четыре раза: возвращаемое значение, 2 аргумента функции и определение переменной z. То есть Type используется как любой обычный тип.

Основные свойства параметров шаблона:

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

- список параметров шаблона функций не может быть пустым, так как при этом теряется возможность параметризации и шаблон функций становится обычным определением конкретной функции;

- в списке параметров шаблона функций может быть несколько параметров. Каждый из них должен начинаться со служебного слова class.

Например, допустим такой заголовок шаблона:

template <class type1, class type2>

Соответственно, неверен заголовок:

template <class type1, type2, type3>

- недопустимо использовать в заголовке шаблона параметры с одинаковыми именами, т.е. ошибочен такой заголовок:

template <class t, class t, class t>

- все параметры шаблона функций должны быть обязательно использованы в спецификациях параметров определения функции.

Имя параметра шаблона (в наших примерах type1, type2 и т.д.) имеет в определяемой шаблоном функции все права имени типа, т.е. с его помощью могут специализироваться формальные параметры, определяться тип возвращаемого функцией значения и типы любых объектов, локализованных в теле функции.

 

Пример 2:

#include <iostream.h>

#include <conio.h>

#include <math.h>

template <class Type1, class Type2, class Type3>


1 | 2 | 3 | 4 | 5 | 6 | 7 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.007 сек.)