用一个实际代码来说明。
-
class A
- {
-
public:
-
staticvoid staticmember(){cout<<"static"<<endl;} //static member
-
void nonstatic(){cout<<"nonstatic"<<endl;} //nonstatic member
-
virtualvoid virtualmember(){cout<<"virtual"<<endl;};//virtual member
- };
-
int main()
- {
-
A a;
-
//static成员函数,取得的是该函数在内存中的实际地址,而且因为static成员是全局的,所以不能用A::限定符
-
void(*ptrstatic)()=&A::staticmember;
-
//nonstatic成员函数 取得的是该函数在内存中的实际地址
-
void(A::*ptrnonstatic)()=&A::nonstatic;
-
//虚函数取得的是虚函数表中的偏移值,这样可以保证能过指针调用时同样的多态效果
-
void(A::*ptrvirtual)()=&A::virtualmember;
-
-
//函数指针的使用方式
-
ptrstatic();
-
(a.*ptrnonstatic)();
-
(a.*ptrvirtual)();
- }
可以参考《C++ Primer(3rd)》第532页13.6指向类成员的指针一节~
1.一个指向外部函数的指针声明为:
-
void(*pf)(char*,constchar*);
-
void strcpy(char* dest,constchar* source);
-
pf=strcpy;
2.一个指向类A成员函数的指针声明为:
-
void(A::*pmf)(char*,constchar*);
声明的解释是:pmf是一个指向A成员函数的指针,返回无类型值,函数带有二个参数,参数的类型分别是char * 和 const char *。除了在星号前增加A:: ,与声明外部函数指针的方法一样。
3.给成员指针赋值的方法是将函数名通过指针符号&赋予指针名。
如下所示:
-
class A
- {
-
-
public:
-
-
void strcpy(char*,constchar*);
-
-
void strcat(char*,constchar*);
-
- };
-
-
pmf =&A::strcpy;