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

程序代码

如下所示:

#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;

这句中:

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

其余各行原理同上。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值