Разъяснение по указателю на нестатический член класса - PullRequest
3 голосов
/ 20 декабря 2011

Когда мне нужен указатель на член класса, я делаю следующее

struct MyStruct
{
    int foo();
};

int (MyStruct::*p)() = &MyStruct::foo;

У меня вопрос, почему я должен использовать & оператор, чтобы взять адрес, который может быть проигнорирован, если бы это была статическая функция. Кроме того, я слышал, что указатель на членов на самом деле не является указателем. Может кто-то уточнить это?

Ответы [ 2 ]

6 голосов
/ 20 декабря 2011

Если это статическая функция, она работает как обычный указатель на функцию, не являющуюся членом: само имя функции может быть неявно преобразовано в указатель на функцию.

Если это нестатическая функция-член, она больше не похожа на функцию, не являющуюся членом:

  1. Имеет скрытый параметр this;
  2. В сценарии множественного наследования преобразование указателя на один из базовых классов может привести к получению указателя на другой адрес. Это означает, что если функция-член наследуется, указатель this может потребоваться изменить перед вызовом. Это уже делает невозможным использование указателя для хранения функции указателя на член.

Раймонд Чен написал об этом интересную статью с более подробной информацией и примерами.

0 голосов
/ 20 декабря 2011

почему мне нужно использовать & оператор, чтобы взять адрес, который можно игнорировать, если бы он был статической функцией

Вы правы, в случае указателя на синтаксис функции-членав идеале & можно опустить.Я думаю, что & синтаксис существует может быть из-за исторического соглашения.

Я слышал, что указатель на членов на самом деле не является указателем, Может кто-то прояснить это?

Это не правильно.Разница лишь в том, что они являются указателями на функцию-член.Поскольку нестатический элемент class содержит в качестве аргумента неявный указатель this, они имеют специальную подпись.Кроме того, они не могут быть преобразованы в обычный указатель на функцию с такой же сигнатурой.

В вашем примере кода теоретически p указывает на:

int MyStruct::foo (MyStruct* const);
...