2011-12-20 2 views
3

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

struct MyStruct 
{ 
    int foo(); 
}; 

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

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

ответ

6

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

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

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

Raymond Chen wrote an interesting article об этом более подробно и примеры.

+0

Agree.And адрес указателя функции, не являющихся членами могут быть решены во время компиляции. Однако для указателя функции члена его адрес будет разрешен во время выполнения, например, виртуальная функция. Таким образом, он не может использовать один адрес для представления функции-указателя-объекта-члена – RolandXu

-2

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

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

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

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

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

int MyStruct::foo (MyStruct* const); 
+2

'static_assert (! Std :: is_pointer :: value," Указатель на функцию-член не является указатель ");'. –

Смежные вопросы