C/C++的函数名称可以退化到对应的函数指针,即以下写法是相同的:
int foo();
int (*p)();
p = foo; // OK
p = &foo; // OK
但是成员函数指针不能隐式退化,即以下是不同的:
struct T { int foo(); };
int (T::*p)();
p = T::foo; // ERROR!
p = &T::foo; // OK
类名::函数成员名,这个不是地址,这个就和变量名称一样,代表一个储存空间。
你可以试一下,有或没有&效果应该是一样的。因为C/C++提供的写法有不少是变通的,比如你提到的普通函数指针问题,你加上&也是合法的;那么指向类的成员函数的指针赋值时用不用&效果也应该是一样的。如:
//#include "stdafx.h"//vc++6.0加上这一行.
#include
using namespace std;
struct testClass{
void testFun(){cout<<"testFun()\n";}
};
int main(int argc, char* argv[]){
void(testClass::*p)();
p=&testClass::testFun;//把testClass前的&去掉也应该是可行的.
long offset=(long&)p;
void (*pfun) ();
memcpy(&pfun,&offset,sizeof(offset));
(*pfun)();
return 0;
}