Указатели на функции и класс function

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

Указатели на функции

Объявление указателя на функцию выглядит так:

<Тип> (*<Название указателя>)([<Тип 1>[, ..., <Тип N>]]);

Чтобы присвоить указателю адрес функции, необходимо указать название функции без параметров и круглых скобок справа от оператора =. Типы параметров указателя и функции должен совпадать. Пример объявления указателя и присваивания адреса функции:

int (*pfunc)(int, int) = nullptr;
pfunc = sum;

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

int x = pfunc(30, 10); // Аналогично x = sum(10, 20);

Или так:

int y = (*pfunc)(30, 10);

Пример объявления указателя, вызова функции через указатель и передачи указателя в качестве параметра функции приведен в листинге 12.24.

Листинг 12.24. Указатели на функции

#include <iostream>

void print_ok();
int add(int x, int y);
int sub(int x, int y);
int func(int x, int y, int (*pfunc)(int, int));

int main() {
   // Объявление указателей на функции
   void (*pf1)() = nullptr;
   int (*pf2)(int, int) = nullptr;
   // Присваивание адреса функции
   pf1 = print_ok;
   pf2 = add;
   // Вызов функций через указатели
   pf1();                                      // OK
   std::cout << pf2(30, 10) << std::endl;      // 40
   // Передача указателя на функцию
   // в качестве параметра
   std::cout << func(10, 5, pf2) << std::endl; // 15
   std::cout << func(10, 5, add) << std::endl; // 15
   std::cout << func(10, 5, sub) << std::endl; // 5
   return 0;
}
void print_ok() {
   std::cout << "OK" << std::endl;
}
int add(int x, int y) {
   return x + y;
}
int sub(int x, int y) {
   return x - y;
}
int func(int x, int y, int (*pfunc)(int, int)) {
   return pfunc(x, y);
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов