Синтаксис мови С++ дозволяє використовувати покажчик на функцію.
Як відомо, ім’я будь-якої функції являє собою покажчик-константу, що дорівнює адресі початку входження у функцію, тобто адресі її першої машинної команди. Крім констант, можна також описувати покажчики-змінні на функцію у вигляді:
type (*name) (список аргументів);
де type — тип значення, що повертається функцією;*name — ім’я змінної-покажчика на функцію.Покажчики на функцію потрібні в таких випадках:
- для використання як формальних аргументів у інших функціях;
- для непрямого виклику інших (резидентних) функцій (програм) початок входу в які записується у відоме місце пам’яті.
Приклад 9.8. Програмно реалізувати обчислення суми та різниці двох чисел з використанням покажчика на функцію для доступу до інших функцій.
/* Р9_8.СРР — использование указателя на функцию для доступа к другимфункциям — difference() і sum() */ #inciude <iostream.h> #include <conio.h> int difference (int, int); // прототип функции difference() int sum(int, int); // прототип функции sum() void main ( ) { int (*fun) (int, int); int x = 20, у = 5, z; //присваивание указателю fun адреса функции difference() fun = difference; z = fun(x, у); // вызов функции fun() cout << "z = " << z << endl; // присваивание указателю fun адреса функции sum() fun = sum; z = fun(x, y); cout << "z = " << z << endl; getch(); } // функция определения разности двух чисел — difference() int difference(int a, int b) { return (a-b); } // функция определения суммы двух чисел — sum() int sum(int a, int b) { return (a + b); }
Результати обчислень:
z = 15
z = 25
Покажчики на функції, як і звичайні змінні, можна об’єднати в масиви. Так, коли функції мають прототипи вигляду:
int god (const void*, const void *); int chena (const void*, const void *); int nazv (const void*, const void *); int avtor (const void*, const void *);
можна описати функцію
int (*fcmp[4]) () {god, chena, nazv, avtor};
У результаті буде створено масив функцій, який матиме звичайний доступ до елементів, тобто:
int і=0;
fcmp [і] (pt1, pt2); — виклик функції god (pt1, pt2)
У цьому випадку, замінивши індекс, можна викликати іншу функцію.
Крім повернення результату виконання функцій у вигляді даних за значенням, можливо також здійснити повернення результату за допомогою операцій розіменування<*> чи одержання адреси «&».
Операція розіменування «*» означає, що функція повертає адресу на об’єкт. Функції в такому випадку з’являються як покажчики на функцію, тобто у вигляді:
type * fname (список формальних аргументів)
Описані таким способом функції повинні повертати покажчик на тип (адресу), наприклад:
char dayweek (int data)
{ static char *weekday[ ] = {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”} ;
return weekday [data % 7]; }
Тут функція dayweek() одержує значення data, тобто число днів, що пройшли з якоїсь визначеної дати, і повертає день тижня у вигляді покажчика на char, оскільки weekday —це масив покажчиків на char.
При оголошенні функції як покажчика на функцію результат можна передавати шляхом одержання адреси, тобто використовуючи символ “&”. Така функція буде мати структуру:
type *funame (список формальних аргументів){ static type х; // тело функции …………………… return &x;}
Оскільки значенням покажчика є адреса, то функція може повернути адресу об’єкта того ж типу, що і тип покажчика, який повертається. За необхідності повернення результату функції за посиланням доцільніше використовувати операцію одержання адреси “&” і функцію описувати у вигляді:
type funame (список формальних аргументів)