1类成员指针
1.1对于普通成员函数
定义普通成员函数指针: 类名::*函数指针变量名字
获取类成员函数地址: &类名::成员函数名
class Test { public: void myfunc(int temp) { }; } 在main主函数中 void (Test:: *pfunc)(int); //类成员函数指针变量的定义,变量名字是pfunc pfunc = &Test::myfunc; //类成员函数指针变量被赋值
对于类对象调用成员函数: 类对象名.*函数指针变量名字
对于类对象指针调用成员函数: 指针名->*函数指针变量名字
CT ct, *pct; pct = &ct; (ct.*pfunc)(100); (pct->*pfunc)(200);
1.2对于虚成员函数
和普通成员函数调用方法一样,只不过这个指针指向的是虚函数地址,因为类中有虚函数,会产生一个虚函数表
1.3对于静态成员函数
声明静态成员函数指针: *函数指针变量名
获取类成员函数地址: &类名::成员函数名
因为静态成员是跟着类走的,所以在类里相当于是全局的,所以不用再用类名::来限定作用域
void (* myfpointstatic)(int) = &CT::staticfunc; //定义一个静态的类成员函数指针并给初值 myfpointstatic(100); //直接使用静态成员函数指针名即可调用静态成员函数
2.类成员变量指针
2.1对于普通成员变量
public: int m_a; 在main主函数中 int CT::*mp = &CT::m_a;
跟踪调试发现这个指针并不是真正意义的指针,他不是指向内存的地址,而是这个成员变量和该类对象首地址之间的偏移量
2.2对于静态成员变量
则是一个真正的地址,当然也不用加CT这个类作用域