Это объявление пытается определить обычную функцию по имени p
, которая возвращает указатель на член класса Screen
типа char
. Поскольку объявляется обычная функция, за объявлением не может быть спецификатора const
.
В отличие от обычных указателей на функцию, нет никакого автоматического преобразования между функцией-членом и указателем на этот член:
//
//
pmf = &Screen::get; //
//
pmf = Screen::get; //
//
Как и при использовании указателя на переменную-член, для вызова функции-члена через указатель на член класса используются операторы .*
и ->*
:
Screen myScreen, *pScreen = &myScreen
//
//
char c1 = (pScreen->*pmf)();
//
//
char c2 = (myScreen.*pmf2)(0, 0);
Вызовы (myScreen->*pmf)()
и (pScreen.*pmf2)(0,0)
требуют круглых скобок, поскольку приоритет оператора вызова выше, чем приоритет оператора указателя на член класса.
Без круглых скобок вызов myScreen.*pmf()
был бы интерпретирован как myScreen.*(pmf())
.
Этот код требует вызвать функцию pmf()
и использовать ее возвращаемое значение как операнд оператора указателя на член класса (.*
). Но pmf
— не функция, поэтому данный код ошибочен.
(С::*p)(parms)
и (obj.*p) (args)
.
Псевдонимы типа или typedef
(см. раздел 2.5.1) существенно облегчают чтение указателей на члены. Например, следующий код определяет псевдоним типа Action
как альтернативное имя для типа версии функции get()
с двумя параметрами:
//
//
using Action =
char (Screen::*)(Screen::pos, Screen::pos) const;
Action
— это другое имя для типа "указатель на константную функцию-член класса Screen
, получающую два параметра типа pos
и возвращающую тип char
". Используя этот псевдоним, можно упростить определение указателя на функцию get()
следующим образом:
Action get = &Screen::get; //
Подобно любым другим указателям на функцию, тип указателя на функцию-член можно использовать как тип возвращаемого значения или как тип параметра функции. Подобно любому другому параметру, у параметра указателя на член класса может быть аргумент по умолчанию:
//
//
Screen& action(Screen&, Action = &Screen::get);
Функция action()
получает два параметра, которые являются ссылками на объект класса Screen
, и указатель на функцию-член класса Screen
, получающую два параметра типа pos
и возвращающую тип char
. Функцию action()
можно вызвать, передав ей указатель или адрес соответствующей функции-члена класса Screen
:
Screen myScreen;
//
action(myScreen); //
action(myScreen, get); //
//
action(myScreen, &Screen::get); //