C++成员函数指针的使用方法

C++成员函数指针(pointer to member function)的用法和C语言的函数指针有些相似.

下面的代码说明了成员函数指针的一般用法:


class ClassName {public: int foo(int); }

int (ClassName::*pmf)(int) = &ClassNmae::foo;

ClassName  c;   //.*的用法,经由对象调用

(c.*pmf)(5);      // A

ClassName *pc = &c;  //->*的用法,经由对象指针调用

(Pc->*pmf)(6);   // B

使用typedef可以让代码变得略微好看一点:

typedef int (ClassName::*PMF)(int);

PMF pmf = &ClassName::foo;


注意获取一个成员函数指针的语法要求很严格:


1)        不能使用括号:例如&(ClassName::foo)不对。


2)        必须有限定符:例如&foo不对。即使在类ClassName的作用域内也不行。


3)        必须使用取地址符号:例如直接写ClassName::foo不行。(虽然普通函数指针可以这样)


所以,必须要这样写:&ClassName::foo。



C++成员函数的调用需要至少3个要素:this指针,函数参数(也许为空),函数地址。上面的调用中,->*和.*运算符之前的对象/指针提供了this(和真正使用this并不完全一致,后面会讨论),参数在括号内提供,pmf则提供了函数地址。


注意这里成员函数指针已经开始显示它“异类”的天性了。上面代码中注释A和B处两个表达式,产生了一个在C++里面没有类型(type)的“东西”(这是C++语言里面唯一的例外,其它任何东西都是有类型的),这就是.*和->*运算符:

(c.*pmf)

(Pc->*pmf)

这两个运算符求值生成的“东西”我们只知道可以把它拿来当函数调用一样使唤,别的什么也不能干,甚至都不能把它存在某个地方。就因为这个原因,Andrei Alexandrescu 在他那本著名的《Modern c++ design》里面就说,成员函数指针和这两个操作符号是“curiously half-baked concept in c++”。(5.9节)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值