- •Указатели на функции
- •Тип функции (* имя указателя) (спецификация параметров)
- •Int * ( * fptr ) ( char * , int );
- •Int (*ptr) (char*);
- •Имя_ указателя (список фактических параметров); (* имя указателя) (список фактических параметров);
- •Int len (char* e) {
- •Int main (){
- •Int (*ptr) (char*); //объявлен указатель на функцию
- •Массивы указателей на функции
- •Float ( * ptrArray [ 4 ] ) ( char , int ) ;
- •Определение типа указателя на функцию
- •Typedef int (* ptr) ( int);
- •Typedef void (* ptf ) ( ptr , int , char*);
- •Int main () { int n;
- •Void table ( func ptrA [ ] , int n, float xn , float xk , float dx )
- •Int main () {
- •Void main ( )
- •Ссылка на функцию Определение:
- •Void main ( )
- •Void (*pf) (char) (func) ;
- •Void (& rf)(char)( func ); Ссылка - возвращаемый результат функции
- •Return имя переменной;
- •Int & rmax ( int n , int d [ ] )
- •Void main ()
- •Рекурсивные функции
- •Шаблоны функций
- •Void swap (t&X, t&y)
- •Void swap (long &X, long &y) //2
- •Void swap (double &X, double &y) //3
- •Void main()
- •Свойства:
- •B func ( a r, c t ) { b V; …} -ошибка
- •Перегрузка функций
- •Void f (int);
- •Void f (int, int);
- •Void f (char*);
- •Void main ()
- •Подставляемые функции
- •Inline float Line(float x1,float y1,float x2, float y2)
Void table ( func ptrA [ ] , int n, float xn , float xk , float dx )
{ float x = xn;
while ( x<= xk )
{ cout << "\n";
for (int i=0; i< n; i++)
{ cout. width(10); cout << (* ptrA[i] ) (x);}
x+=dx ;
}
system("pause");
}
Int main () {
table ( S, 3, 0., 2., 0.1 );
return 0;
}
Указатель на функцию – результат работы функции
Указатель на функцию может быть результатом работы функции, то есть функция может возвращать указатель на функцию с помощью оператора return и с помощью формального параметра (например, передача параметра по ссылке).
Ниже приведен пример программы, в которой используются функции возвращающие указатели на функции с помощью return и с помощью формального параметра (например, передача параметра по ссылке).
. . .typedef void ( * menu) ( )
menu act [4] = { act1, act2 , act3 , act 4};
menu V (int i) { return act [i] }
// функция возвращает указатель на
// функцию как результат работы функции
void W (int i , menu & f) { f = act [i] }
// функция возвращает указатель на
// функцию , используя формальный параметр
Void main ( )
{ int i ;
menu nf , ff;
while(1)
{ cin >> i ;
if ( i>=1 && i<=4 )
{ nf = V ( i-1);
nf( ) ; // вызов функции
act [i-1] ( ) ; // вызов функции
W( i-1, ff) ;
ff ( ) ; // вызов функции
}
else exit ( 0) ;
}
}
Ссылка на функцию Определение:
<тип функции> (& имя_ссылки) ( спецификация параметров)
<инициализирующее выражение>;
<инициализирующее выражение> - имя уже известной функции, имеющей тот же тип и ту же сигнатуру параметров, что и ссылка.
Инициализация обязательна!
Ссылка на функцию – синоним функции, обладает всеми правами основного имени функции
. . .
void func (char c) { cout <<c <<endl ;}
Void main ( )
{ void (*pf) (char) = func;
void (& rf)(char) = func ;
(*pf) (‘A’) ; func ( ‘B’) ; rf (‘C’) ;
}
A
B
C
Инициализация может быть и в круглых скобках
Void (*pf) (char) (func) ;
Void (& rf)(char)( func ); Ссылка - возвращаемый результат функции
Ссылки не являются настоящими объектами, ссылка связана с участком памяти инициализирующего ее выражения.
Если функция возвращает ссылку, это означает, что функция должна возвращать не значение, а идентификатор для обращения к некоторому – участку памяти, в простейшем случае имя переменной. Таким образом, в функции должен быть, например, такой оператор:
Return имя переменной;
При этом следует помнить, что в операторе return не должно стоять имя локальной переменной, так как после вызова функции участки памяти, связанные в сегменте стека с локальными переменными, становятся недоступными. Таким образом, в операторе должно стоять имя участка памяти из внешней программы.
Вызов такой функции представляет собой частный случай l-значения (l-value), которое представляет в программе некоторый участок памяти. Этот участок памяти может иметь некоторое значение и это значение можно изменять, например, в операторе присваивания.
В соответствие с этим, вызов такой функции может располагаться как в правой, так и в левой части оператора присваивания.
Пример: определить функцию, возвращающую ссылку на элемент массива c максимальным значением. Массив передается в функцию из главной функции посредством параметра.
…
