C++的类成员和类成员函数指针
类成员函数指针:
用于访问类成员函数,和一般函数指针有区别。
类成员函数处理的是类数据成员,声明类成员函数指针的同时,还要指出具体是哪个类的函数指针才可以。调用时也要通过对象调用。
而对于类的静态成员函数,它是类对象共享的,且只能处理静态数据成员,所以它的函数指针可以类似一般函数指针一样使用。
1 class Test
2 {
3 public:
4 void fun(int);
5 void fun(int) const; //重载函数,加一个const限制
6 static void fun_static(int);
7
8 int m_data;
9 };
10
11 void Test::fun(int i)
12 {
13 cout << "fun " << i << endl;
14 }
15
16 void Test::fun(int i) const
17 {
18 cout << "const fun " << i << endl;
19 }
20
21 void Test::fun_static(int i)
22 {
23 cout << "static " << i << endl;
24 }
25
26 int main()
27 {
28 void (Test::*pfun)(int) = &Test::fun; //成员函数指针,要加类域作用符,且等号右边要加&取函数地址(理解为取类成员地址)
29 void (Test::*pfunConst)(int) const = &Test::fun; //同上,const版本成员函数的指针
30 void (*pfunStatic)(int) = &Test::fun_static; //静态成员函数的指针,不用加域作用符,等号右边也可以不加&符号。和普通函数指针使用方式相同
31 int (Test::*pi) = &Test::m_data; //类数据成员指针
32
33 Test a;
34 const Test b; //注意!gcc编译时报错,提示定义const变量需要显示定义构造函数;VS编译时警告,编译器生成的默认构造函数初始化的“const”自动数据产生不可靠的结果
35
36 a.*pi = 3;
37 //b.*pi = 4; //const对象不能修改数据成员
38
39 a.fun(3); //输出 fun 3
40 b.fun(3); //输出 const fun 3,const对象只能调用const成员函数
41
42 (a.*pfun)(3); //通过对象调用成员函数指针,输出 fun 3
43 (a.*pfunConst)(3); //通过普通对象调用const版本的函数, 输出 const fun 3
44
45 //(b.*pfun)(3); //const对象不能调用普通函数
46 (b.*pfunConst)(3); //输出const fun 3
47
48 pfunStatic(3); //输出static fun 3,静态成员函数指针,可直接调用
49 Test::fun_static(3); //同上
50
51 return 0;
52 }