C++成员函数指针详细使用指南

C++程序中,很多函数是成员函数,即这些函数是某个类中的一部分。你不可以像一个普通的函数指针那样指向一个成员函数,正确的做法应该是,你必须使用一个成员函数指针。一个成员函数的指针指向类中的一个成员函数,并和以前有相同的参数,声明如下:

 
 
  1. float (SomeClass::*my_memfunc_ptr)(int, char *); 

对于使用const关键字修饰的成员函数,声明如下:

 
 
  1. float (SomeClass::*my_const_memfunc_ptr)(int, char *) const; 

注意使用了特殊的运算符(::*),而“SomeClass”是声明中的一部分。C++成员函数指针有一个可怕的限制:它们只能指向一个特定的类中的成员函数。对每一种参数的组合,需要有不同的成员函数指针类型,而且对每种使用const修饰的函数和不同类中的函数,也要有不同的函数指针类型。在MSVC中,对下面这四种调用方式都有一种不同的调用类型:

__cdecl, __stdcall, __fastcall, 和 __thiscall。

(__thiscall是缺省的方式,有趣的是,在任何官方文档中从没有对__thiscall关键字的详细描述,但是它经常在错误信息中出现。如果你显式地使用它,你会看到“它被保留作为以后使用(it is reserved for future use)”的错误提示。)

如果你使用了C++成员函数指针,你最好使用typedef以防止混淆。将函数指针指向型如float SomeClass::some_member_func(int, char *)的函数,你可以这样写:

 
 
  1. my_memfunc_ptr = &SomeClass::some_member_func; 

很多编译器(比如MSVC)会让你去掉“&”,而其他一些编译器(比如GNU G++)则需要添加“&”,所以在手写程序的时候我建议把它添上。若要调用成员函数指针,你需要先建立SomeClass的一个实例,并使用特殊操作符“->*”,这个操作符的优先级较低,你需要将其适当地放入圆括号内。

 
 
  1. SomeClass *x = new SomeClass;  
  2. (x->*my_memfunc_ptr)(6, "Another Arbitrary Parameter"); 

如果类在栈上,你也可以使用“.*”运算符。

 
 
  1. SomeClass y;  
  2. (y.*my_memfunc_ptr)(15, "Different parameters this time"); 

不要怪我使用如此奇怪的语法——看起来C++的设计者对标点符号有着由衷的感情!C++相对于C增加了三种特殊运算符来支持成员指针。“::*”用于指针的声明,而“->*”和“.*”用来调用指针指向的函数。这样看起来对一个语言模糊而又很少使用的部分的过分关注是多余的。(你当然可以重载“->*”这些运算符,但这不是本文所要涉及的范围。)

一个C++成员函数指针可以被设置成0,并可以使用“==”和“!=”比较运算符,但只能限定在同一个类中的成员函数的指针之间进行这样的比较。任何成员函数指针都可以和0做比较以判断它是否为空。与函数指针不同,不等运算符(<, >, <=, >=)对C++成员函数指针是不可用的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值