1 /**/ /********************************************************************************
 2 **
 3 **       Filename:  test.cpp
 4 **
 5 **    Description:  
 6 **
 7 **        Version:  1.0
 8 **        Created:  2011年06月23日 08时36分30秒
 9 **       Revision:  none
10 **       Compiler:  gcc
11 **
12 *********************************************************************************/

13 #include  < iostream >
14 using   namespace  std;
15
16 class  C 
17 {
18
19public:
20    void f(int a);
21    int mem;
22}
;
23
24 void  C::f( int  a)
25 {
26    cout << "void C::f " << a << endl;
27}

28
29 int  main()
30 {
31    void (C::*pfmem)(int= &C::f;
32    int C::*pdmem = &C::mem;
33
34    //void (C::*pfmem1)(int) = C::f;//error
35    //int C::*pdmem1 = C::mem;//error
36
37    C* cp = new C;
38    //cp->*pfmem(10);//error
39
40    (cp->*pfmem)(10);
41    cout << cp->mem << endl;
42    (cp->*pdmem) = 100;
43    cout << cp->mem << endl;
44
45    int a=0;
46    cout <<  a << endl;
47    a = ++cp->*pdmem;//warning
48    cout <<  a << endl;
49
50    a=cp->*pdmem;
51    cout <<  a << endl;
52    a++;
53    cout <<  a << endl;
54
55
56    cp->f(6);
57    cout << cp->mem << endl;
58
59    (cp->*pdmem) = 6;
60    cout << cp->mem << endl;
61    cout << (cp->*pdmem) << endl;
62
63    //for test
64    C c;
65    cout << c.mem << endl;
66    c.f(10);
67
68    (c.*pdmem) = 100;
69    cout << c.mem << endl;
70    cout << (c.*pdmem) << endl;
71
72    return 0;
73}

74


如果不注释掉//error行:
zhy@desktop:~/doublemint/test$ g++ -o test test.cpp
test.cpp: In function ‘int main()’:
test.cpp:38: error: invalid use of non-static member function ‘void C::f(int)’
test.cpp:25: error: invalid use of non-static data member ‘C::mem’
test.cpp:39: error: from this location
test.cpp:40: error: invalid use of non-static member function ‘void C::g()’
test.cpp:43: error: must use ‘.*’ or ‘->*’ to call pointer-to-member function in ‘pfmem (...)’
可见
1.类成员函数指针右值必须使用&C::f的形式,C::f会报错
2.因为函数运算符的优先级比->*运算符高,所以会在编译时产生错误,不能在没有首先反引用的情况下调用成员函数指针。在这里需要使用括号。


反引用运算符->*可以用类对象指针反引用成员指针,而.*可以用类对象反引用成员指针。
这也就是如何使用类成员函数指针的办法
注释掉后:
zhy@desktop:~/doublemint/test$ ./test
void C::f 10
0
100
0
0
0
1
void C::f 6
0
6
6
-1218646028
void C::f 10
100
100

数组成员指针会带来更多的问题
对于//warning行
因为->*的优先级比++低,所以再降反引用成员指针之前,增加cp的值。除非cp正指向类对象的数组,否则这很可能产生错误的反引用。
.*的用法和->*是一样的,在第66行之后。