С++ для начинающих

Тип указателя на функцию


Как объявить указатель на функцию? Как выглядит формальный параметр, когда фактическим аргументом является такой указатель? Вот определение функции lexicoCompare(), которая сравнивает две строки лексикографически:

#include <string>

int lexicoCompare( const string &sl, const string &s2 ) {

    return sl.compare(s2);

}

Если все символы строк s1 и s2 равны, lexicoCompare() вернет 0, в противном случае– отрицательное число, если s1 меньше чем s2, и положительное, если s1 больше s2.

Имя функции не входит в ее сигнатуру – она определяется только типом возвращаемого значения и списком параметров. Указатель на lexicoCompare() должен адресовать функцию с той же сигнатурой. Попробуем написать так:

int *pf( const string &, const string & ) ;

// нет, не совсем так

Эта инструкция почти правильна. Проблема в том, что компилятор интерпретирует ее как объявление функции с именем pf, которая возвращает указатель типа int*. Список параметров правилен, но тип возвращаемого значения не тот. Оператор разыменования (*) ассоциируется с данным типом (int в нашем случае), а не с pf. Чтобы исправить положение, нужно использовать скобки:

int (*pf)( const string &, const string & ) ;

// правильно

pf объявлен как указатель на функцию с двумя параметрами, возвращающую значение типа int, т.е.  такую, как lexicoCompare().

pf способен адресовать и приведенную ниже функцию, поскольку ее сигнатура совпадает с типом lexicoCompare():

int sizeCompare( const string &sl, const string &s2 );

Функции calc() и gcd()другого типа, поэтому pf не может указывать на них:

int calc( int , int );

int gcd( int , int );

Указатель, который адресует эти две функции, определяется так:

int (*pfi)( int, int );

Многоточие является частью сигнатуры функции. Если у двух функций списки параметров отличаются только тем, что в конце одного из них стоит многоточие, то считается, что функции различны. Таковы же и типы указателей.

int printf( const char*, ... );

int strlen( const char* );

int (*pfce)( const char*, ... ); // может указывать на printf()

int (*pfc)( const char* );       // может указывать на strlen()

Типов функций столько, сколько комбинаций типов возвращаемых значений и списков параметров.



Содержание раздела