函数指针和类成员指针经常被用作参数进行传递,多态和函数重载都会用到.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <string>
#include <string.h>
using namespace std;
class Demo {
public:
    void show() {
    cout << "member method Demo::show() did call" << endl;
    str = "str from Demo::show()";
    }
    string str;
};
void show() {
    cout<<"普通函数指针被调用"<<endl;
}
int main(int argc, char* argv[]) {
    //普通函数指针
    //将普通函数show的地址赋值给pPainShow,优先级原因,必须在(*pPainShow)外加小括号,
    //否则编译器会将此认为是一个void* pPainShow(); 的函数声明,显然,我们不是这个意思.^_^
    void (*pPainShow)() = &show;
    (*pPainShow)();

    //指向类成员变量的指针
    //将Demo::str的地址赋值给 pStr指针
    string Demo::*pStr = &Demo::str;
    
    //指向类成员方法的指针
    //将Demo::show的地址赋值给pShow,此处因为优先级问题,必须在Demo::*pShow外加小括号.
    void (Demo::*pShow)(/*参数列表...*/)=&Demo::show;
    Demo *d=new Demo;
    Demo dd;
    cout<<"准备通过指向成员函数的指针调用函数"<<endl;
    (d->*pShow)();
    (dd.*pShow)();
    cout<<"准备通过指向成员变量的指针访问变量"<<endl;
    cout<<d->*pStr<<endl;
    cout<<dd.*pStr<<endl;
}