【C++】class的设计与使用(十一)指向类成员函数的指针 VS 一般函数指针

指向类成员函数的指针 VS 一般函数指针

相同点

  • 皆需指定其返回类型参数列表
  • 目的均为方便调用;

不同点一

指向类成员函数的指针要标明它所指的是哪个类

void (num_sequence::*pm)(int) = 0;
//pm指针就是指向的num_sequence这个类的成员函数

以上可以用typedef加以简化:

typedef void(num_sequence::*PtrType)(int);
PtrType pm = 0;
class num_sequence{
public:
	typedef void(num_sequence::*PtrType)(int);
	
	//_pmf可指向下列任何一个函数
	void fibonacci(int);
	void pell(int);
	void lucas(int);
	void triangular(int);
	void sequence(int);
	void pentagonal(int);
	//...
private:
	PtrType _pmf;
}

//取得某个成员函数的地址
PtrType pm = &num_sequence::fibonacci;

//同理,指定成员函数指针的值
pm=&num_sequence::triangular;
const int num_sequence::num_seq;
vector<vector<int> >num_sequence::seq(num_seq);//两个>之间必须有空格

num_sequence::PtrType num_sequence::func_tbl[num_seq]=
{	0,
	&num_sequence::fibonacci,
	&num_sequence::pell,
	&num_sequence::lucas,
	&num_sequence::triangular,
	&num_sequence::square,
	&num_sequence::pentagona
};

不同点二

类成员函数指针须通过同类的类对象来加以调用,而此对象便是成员函数内this指针所指之物。

//举例
num_sequence ns;
num_sequence *pns=&ns;
PtrType pm=&num_sequence::fibonacci;

//为了通过ns调用_pmf:
(ns.*pm)(pos);
//.*是个成员选择指针运算符

//类对象指针专有的运算符:->*
(pns->*pm)(pos);
int num_sequence::elem(int pos)
{
	if(!check_integrity(pos))
		return 0;
	if(pos>_elem->size())
		(this->*_pmf)(pos);
	
	return (*_elem)[pos-1];
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值