先简单的说说非静态的成员函数。
非静态成员函数指针的类型:
类的非静态成员是和类的对象相关的。也就是说,要通过类的对象来访问变量。
成员函数的类型定义为:
typedef void (A::*pfunc)();
A是一个类,有一个成员函数void test();
使用:
pfunc p = A::test;
示例:
#include <iostream>
using namespace std;
class A {
public :
void test1() { cout << "test" << endl; };
public :
};
typedef void (A::*PFunc)();
int main() {
A a;
PFunc f = &(A::test1);
(a.*f)();
system("PAUSE");
return 0;
}
需要注意的是 因为成员函数地址的解引用必须要附驻与某个对象的地址,所以我们必须创建某个对象,来调用这个函数。
静态成员函数,可以通过类作用域符来访问。
静态成员函数的类型: 静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用 类成员函数指针来储存。
typedef void (*pfunc) ();
这个和普通函数的指针是一样的。
使用的时候也可以像普通函数一样。
示例:
#include <iostream>
using namespace std;
class A {
public :
static void test1() { printf("test\n"); };
public :
};
typedef void (*PFunc)();
int main() {
PFunc f = &(A::test1);
(*f)();
system("PAUSE");
return 0;
}
另外: 静态成员的初始化不受访问控制的限制。
根据C++primer所说,要想确保对象只定义一次,最好的办法就是把静态数据成员的定义和其他非内联函数的定义放在同一个文件中。