1 #include <iostream>
2 using namespace std;
3
4 //myclass类
5 class myclass
6 {
7 public:
8 int add(int a, int b)
9 {
10 return a + b;
11 }
12 int sub(int a, int b)
13 {
14 return a - b;
15 }
16 int mul(int a, int b)
17 {
18 return a * b;
19 }
20 int divv(int a, int b)
21 {
22 return a / b;
23 }
24 };
25
26 //类成员函数当做引用参数
27 void change(int(myclass::*&p)(int, int))
28 {
29 p = &myclass::sub;
30 }
31
32 //changeit的参数是类成员函数指针的引用,返回值是类成员函数指针的引用
33 //类成员函数指针作为参数退化为二级类成员函数指针
34 int(myclass::*& changit( int(myclass::* &p)(int, int) ) )(int, int)
35 {
36 p = &myclass::sub;
37 return p;
38 }
39
40 void main()
41 {
42 myclass *pclass(nullptr);//空指针
43 //int(myclass::*p)(int, int) = &myclass::add;//类成员函数指针
44 //cout << pclass->add(1, 2) << endl;
45 //cout << (pclass->*p)(2, 3) << endl;
46 int(myclass::*p[4])(int, int) { &myclass::add, &myclass::sub, &myclass::mul, &myclass::divv };
47 //下标方式循环
48 for (int i = 0; i < 4; i++)
49 {
50 //调用类成员函数数组
51 cout << (pclass->*p[i])(100, 10) << endl;
52 }
53
54 //指针方式循环(二级类成员函数指针遍历类成员函数指针)
55 for (int(myclass::**pp)(int, int) = p; pp < p + 4; pp++)
56 {
57 cout << (pclass->**pp)(100, 10) << endl;
58 }
59
60 //在堆上创建类成员函数指针
61 int (myclass::**p2)(int,int) = new (int(myclass::*[4])(int,int)){ &myclass::add, &myclass::sub, &myclass::mul, &myclass::divv };
62 for (int i = 0; i < 4; i++)
63 {
64 //调用类成员函数数组
65 cout << (pclass->*p2[i])(100, 10) << endl;
66 }
67
68 int(myclass::*p3)(int, int) = &myclass::add;
69 change(p3);
70 (pclass->*p3)(12, 2);
71 cin.get();
72 }