程序代码
如下所示:
#include<iostream>
using namespace std;
class Dog
{
public:
int run(int i) const { cout << "run\n"; return i; }
int eat(int i) const { cout << "eat\n"; return i; }
int sleep(int i) const { cout << "ZZZ\n"; return i; }
typedef int(Dog::*PMF)(int) const;
class FunctionObject
{
Dog* ptr;
PMF pmem;
public:
FunctionObject(Dog* wp, PMF pmf) :ptr(wp), pmem(pmf){ cout << "FunctionObject constructor\n"; }
int operator()(int i) const
{
cout << "FunctionObject::operator()\n";
return (ptr->*pmem)(i);
}
};
FunctionObject operator->*(PMF pmf)
{
cout << "operator->*" << endl;
return FunctionObject(this, pmf);
}
};
int main()
{
Dog w;
Dog::PMF pmf = &Dog::run;
cout << (w->*pmf)(1) << endl;
pmf = &Dog::sleep;
cout << (w->*pmf)(2) << endl;
pmf = &Dog::eat;
cout << (w->*pmf)(3) << endl;
return 0;
}
程序分析
1.typedef int(Dog::*PMF)(int) const;
这句是用于简化定义的。新的类型名是PMF,是一个函数指针。其取代的类型表示Dog类的成员函数。如果将*PMF替换为特定的成员函数名,则与函数定义相同。故其格式与成员函数格式相似。
2.程序运行结果分析
运行结果如下图所示:
在
cout << (w->*pmf)(1) << endl;
这句中:
- 调用
operator->*
函数,因此打印相应的字符串 - 此函数返回一个
FunctionObject
对象,在复制过程中调用其构造函数,因此打印出第二行的字符串 - 由于随后跟了个
(1)
,因此调用了FunctionObject的operator()
函数,因此打印出第三行的字符串 operator()
函数返回(ptr->*pmem)(i)
,此返回值中,*pmem
为Dog::PMF pmf = &Dog::run;
,因此是等价于w.run(i)
,故有第四行内容
其余各行原理同上。