Fork me on GitHub

C++成员函数指针

类成员函数指针(member function pointer),是C++语言的一类指针数据类型,用于存储一个指定)具有给定的形参列表与返回值类型的成员函数的访问信息。

要注意两点:

①函数指针赋值要使用 &

②使用.*(实例对象)或者->*(实例对象指针)调用类成员函数指针所指向的函数

非静态的成员方法函数指针语法:

void (*ptrStaticFun)() = &ClassName::staticFun;

成员方法函数指针语法:

void (ClassName::*ptrNonStaticFun)() = &ClassName::nonStaticFun;
注意调用类中非静态成员函数的时候,使用的是 类名::函数名,而不是 实例名::函数名。

示例代码:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
# include <stdio.h>
# include <iostream>
using namespace std;

class MyClass {
public:
static int FunA(int a, int b) {
cout << "call FunA" << endl;
return a + b;
}
void FunB() {
cout << "call FunB" << endl;
}

void FunC() {
cout << "call FunC" << endl;
}

int pFun1(int (*p)(int, int), int a, int b) {
return (*p)(a, b);
}

void pFun2(void (MyClass::*nonstatic)()) {
(this->*nonstatic)();
}
};


int main() {
MyClass m;
MyClass* obj = new MyClass;
// 静态函数指针的使用
int (*pFunA)(int, int) = &MyClass::FunA;
cout << pFunA(1, 2) << endl;

// 成员函数指针的使用
void (MyClass::*pFunB)() = &MyClass::FunB;
(obj->*pFunB)();

m.*pFunB();

// 通过 pFun1 只能调用静态方法
obj->pFun1(&MyClass::FunA, 1, 2);

// 通过 pFun2 就是调用成员方法
obj->pFun2(&MyClass::FunB);
obj->pFun2(&MyClass::FunC);

delete obj;
return 0;
}
您的鼓励是我持之以恒的动力