Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Объявление указателей на функции

Шаблоны Функций | Использование шаблона функции | Шаблоны функций |


Читайте также:
  1. Ii) Инициализация указателей
  2. III. B. Функции слова ONE
  3. Other Functions of Money. Другие функции денег
  4. Unit 6. Bidding - заявление, объявление
  5. V) Массивы и функции
  6. Абстрактные базовые классы и чисто виртуальные функции
  7. Абстрактные базовые классы и чисто виртуальные функции.

Давайте объявим указатель 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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Указатели на функции| Что такое перегрузка функций?

mybiblioteka.su - 2015-2024 год. (0.008 сек.)