< 返回技术文档列表

C++中如何使用成员函数指针

发布时间:2021-09-01 01:34:14⊙投诉举报

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");

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

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

关于C++中如何使用成员函数指针问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注血鸟云行业资讯频道了解更多相关知识。


/template/Home/Zkeys/PC/Static