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


Указатели на перегруженные функции *


Можно объявить указатель на одну из множества перегруженных функций. Например:

extern void ff( vector<double> );

extern void ff( unsigned int );

// на какую функцию указывает pf1?

void ( *pf1 )( unsigned int ) = &ff;

Поскольку функция ff() перегружена, одного инициализатора &ff недостаточно для выбора правильного варианта. Чтобы понять, какая именно функция инициализирует указатель, компилятор ищет в множестве всех перегруженных функций ту, которая имеет тот же тип возвращаемого значения и список параметров, что и функция, на которую ссылается указатель. В нашем случае будет выбрана функция ff(unsigned int).

А что если не найдется функции, в точности соответствующей типу указателя? Тогда компилятор выдаст сообщение об ошибке:

extern void ff( vector<double> );

extern void ff( unsigned int );

// ошибка: соответствие не найдено: неверный список параметров

void ( *pf2 )( int ) = &ff;

// ошибка: соответствие не найдено: неверный тип возвращаемого значения

double ( *pf3 )( vector<double> ) = &ff;

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

matrix calc( const matrix & );

int calc( int, int );

int ( *pc1 )( int, int ) = 0;

int ( *pc2 )( int, double ) = 0;

// ...

// правильно: выбирается функция calc( int, int )

pc1 = &calc;

// ошибка: нет соответствия: неверный тип второго параметра

pc2 = &calc;



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