Читайте также: |
|
Давайте объявим указатель pfun, который мы сможем использовать для указания на функцию, которая принимает два аргумента, типа char* и int, и возвращает значение типа double. Объявление выглядит так:
double (*pfun)(char*, int); // указатель на ф-июСкобки вокруг имени указателя, pfun, и символа “звездочка” (asterisk), здесь необходимы: без них у нас было бы объявление функции, а не указателя, т.е.:
double *pfun(char*, int); // прототип для функцииЭто прототип функции pfun(), которая имеет два параметра и возвращает указатель на значение типа double, мы же хотим объявить указатель на ф-ию.
Общая форма объявления указателя на ф-ию такова:
return_type (*pointer_name)(list_of_parameter_types);Такой указатель может указывать только на функции, которые имеют один и тот же возвращаемый тип и одинаковый список параметров, как это специфицировано при объявлении указателя.
Как видим, объявление состоит из трех частей:
Мы можем инициализировать указатель на функцию именем предварительно объявленной ф-ии, например, так:
// Function prototypelong sum(long num1, long num2);// Pointer to function points to sum()long (*pfun)(long, long) = sum;Конечно, мы можем использовать и оператор присваивания для того, чтобы наш указатель, указывал на нужную нам функцию. В предположении, что указатель pfun объявлен где-то выше, можно написать:
long product(long, long); // прототип ф-ии... pfun = product; // установить указатель на ф-ию product()Как и для указателей на простые переменные, указатель на функцию должен содержать конкретный адрес до момента использования указателя для вызова ф-ии.
Тест – Указатели на функцию
Рассмотрим простой пример, иллюстрирующий указатели на ф-ии в действии:
// Ex5_01.cpp// pointers to functions#include <iostream>using namespace std; long sum(long a, long b); // Function prototypelong product(long a, long b); // Function prototype int main(){ // Pointer to function declaration long (*pdo_it)(long, long); pdo_it = product; cout << endl // Call product thru a pointer << "3*5 = " << pdo_it(3, 5); pdo_it = sum; // Reassign pointer to sum() cout << endl << "3*(4+5) + 6 = " // Call thru a pointer twice << pdo_it(product(3, pdo_it(4, 5)), 6); cout << endl; return 0;} // Function to multiply two valueslong product(long a, long b){ return a*b;}// Function to add two valueslong sum(long a, long b){ return a+b;}Объяснение
После обычной преамбулы, мы объявляем указатель на ф-ию, pdo_it, который может указывать на любую из объявленных ф-ий, sum() или product(). В операторе присваивания:
pdo_it = product;имя функции автоматически преобразуется в адрес, который будет храниться в указателе.
Затем ф-ия product() вызывается косвенно через указатель pdo_it iпри выводе:
cout << endl // Call product thru a pointer << "3*5 = " << pdo_it(3, 5);Имя указателя используется так, как если бы оно было именем ф-ии, и список аргументов пишется как при прямом вызове ф-ии.
Далее указатель перенаправляется на ф-ию sum() и показывается, что указатель на ф-ию применяется обычным для ф-ий способом.
Дата добавления: 2015-11-16; просмотров: 54 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Указатели на функции | | | Что такое перегрузка функций? |