在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);