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