operator->*运算符重载程序分析

程序代码

如下所示:

#include
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.程序运行结果分析

运行结果如下图所示:
operator->*运算符重载程序分析_第1张图片

cout << (w->*pmf)(1) << endl;

这句中:

  1. 调用operator->*函数,因此打印相应的字符串
  2. 此函数返回一个FunctionObject对象,在复制过程中调用其构造函数,因此打印出第二行的字符串
  3. 由于随后跟了个(1),因此调用了FunctionObject的operator()函数,因此打印出第三行的字符串
  4. operator()函数返回(ptr->*pmem)(i),此返回值中,*pmemDog::PMF pmf = &Dog::run;,因此是等价于w.run(i),故有第四行内容

其余各行原理同上。

你可能感兴趣的:(C++编程思想)