C++成员函数指针详细使用指南
我们曾经在一篇文章中为大家详细介绍了有关C++函数指针的相关问题,那么今天大家将会进一步对这方面的知识有一个充分的掌握。在C++程序中,很多函数是成员函数,即这些函数是某个类中的一部分。你不可以像一个普通的函数指针那样指向一个成员函数,正确的做法应该是,你必须使用一个成员函数指针。一个成员函数的指针指向类中的一个成员函数,并和以前有相同的参数,声明如下:
float (SomeClass::*my_memfunc_ptr)(int, char *);
对于使用const关键字修饰的成员函数,声明如下:
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 *)的函数,你可以这样写:
my_memfunc_ptr = &SomeClass::some_member_func;
很多编译器(比如MSVC)会让你去掉“&”,而其他一些编译器(比如GNU G++)则需要添加“&”,所以在手写程序的时候我建议把它添上。若要调用成员函数指针,你需要先建立SomeClass的一个实例,并使用特殊操作符“->*”,这个操作符的优先级较低,你需要将其适当地放入圆括号内。
SomeClass *x = new SomeClass; (x->*my_memfunc_ptr)(6, "Another Arbitrary Parameter");
如果类在栈上,你也可以使用“.*”运算符。
SomeClass y; (y.*my_memfunc_ptr)(15, "Different parameters this time");
相关推荐
Web前端成长之路 2020-07-07
hanjinixng00 2020-11-12
bearhoopIT之道 2020-11-11
拉斯厄尔高福 2020-10-19
dabian 2020-09-07
csdnyasin 2020-06-28
徐建岗网络管理 2020-06-26
penkgao 2020-06-25
fengjing81 2020-06-24
penkgao 2020-06-13
qscool 2020-06-12
chaocc0xs 2020-06-12
风吹夏天 2020-06-08
fengjing81 2020-06-06
jvm 2020-06-06
AaronPlay 2020-06-02