Передача функций в качестве параметров
Имя любой функции представляет собой указатель, то есть адрес памяти, определяющий, где находится функция, и задающий точку входа в функцию. Убедиться в этом можно выведя на экран значение имени функции. Например:
cout << C << endl; // C –это функция из предыдущего параграфа
На экране будет отображен в шестнадцатеричном формате адрес точки входа в функцию С, вычисляющую значения биномиальных коэффициентов.
Используя тот факт, что имена функций являются обычными указателями, можно передавать функции в качестве аргументов других функций.
Для этого необходимо специальным образом определить тип данных указателя на функции, передаваемые в качестве аргумента, который должен соответствовать характеристикам передаваемых функций (тип возвращаемого значения, параметры функции).
Рассмотрим пример:
Double add (double a, double b)
{
return a + b;
}
Double mul (double a, double b)
{
return a * b;
}
typedef double (*f_Ptr) (double, double);
Double oper (f_Ptr F, double a, double b)
{
Return F (a, b);
}
Int main ()
{
cout << oper (add, 20, 30) << endl; // 50
cout << oper (mul, 20, 30) << endl; // 600
Return 0;
}
В этом примере имеется некоторая универсальная функция oper, возвращающая значение вычисленной функции F для заданных значений aиb. Функция F, которую необходимо вычислить, передается в функцию oper через параметр этой функции. Ключевые элементы этого алгоритма выделены красным цветом. Для того, чтобы параметр F функции oper мог принимать в качестве аргумента другую функцию, с помощью инструкции typedef определяется тип данных указателя f_Ptr на функции, возвращающие значение типа double и имеющие два параметра типа double.
Этот пример носит исключительно демонстрационный характер. На самом деле, с помощью этого приема удается реализовывать сложные универсальные алгоритмы обработки различных данных.
Несколько слов об инструкции typedef. С помощью этой инструкции можно определять новые типы данных и переопределять уже имеющиеся. Например: довольно утомительно в тексте программы многократно использовать название типа данных unsigned short. С помощью инструкции typedef можно упростить набор текста программы:
Typedef unsigned short UnS;
Теперь везде в тексте программы можно использовать вместо типа unsigned shortтипUnS.
Однако увлекаться такими “переименованиями” не следует. В основном инструкция typedefиспользуется при определении новых пользовательских типов данных.
Дата добавления: 2019-02-07; просмотров: 343;