在C++中使用成员函数指针
函数指针的语法相对比较复杂,成员函数指针则在此基础上进一步引入了类作用域限定。让我们来了解一下成员函数指针的写法。
首先回顾一下函数指针的使用方法。有这样一个函数:
double func(double x) { return 3.14 * x; }
我们这样声明函数指针,并且进行调用:
double (*pfunc)(double x); pfunc = &func; cout << (*pfunc)(1.1) << endl;
指针的声明包括返回类型、指针名和函数的参数表,对于一个强类型的编译型语言,这些要素都必不可少。由于运算符优先级的规定,还要特别注意在适当的位置加上括号。
对于成员函数指针,就是增加了一个作用域限定。
首先有一个类A,包含几个类型相同的函数。
class A { public: void f1(int x) { cout << "f1:" << x << endl; } void f2(int x) { cout << "f2:" << x << endl; } void f3(int x) { cout << "f3:" << x << endl; } };
然后类B的对象会调用类A的对象的成员函数,然而具体调用哪一个还不知道,我们通过指针的方式来实现,在运行时将指针指向一个类型兼容的成员函数。
class B { public: void (A::*pf) (int x); //注意作用域运算符和*的次序,括号不能省略 void callF(int x) { A a; (a.*pf)(x); } };
我们在外部实例化B的对象,然后为B的成员函数指针赋值,确定将要调用的是哪一个函数。
cout << "Hello world!" << endl; B b; b.pf = &A::f2; b.callF(5);