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 }

 

posted @ 2014-09-06 17:59  阿杰的专栏  阅读(577)  评论(0编辑  收藏  举报