C++指针探究(三)成员函数指针[VC/C++编程]
本文“C++指针探究(三)成员函数指针[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
C语言的指针相当的机动便利,但也相当简单出错.很多C语言初学者,乃至C语言老鸟都很简单栽倒在C语言的指针下.但不可否定的是,指针在C语言中的位置极端重要,也答应以过火一点的来说:没有指针的C程序不是真正的C程序.
但是C++的指针却常常给我一种束手束脚的感受.C++比C语言有更严峻的静态范例,愈增夸大范例安全,夸大编译时查抄.因此,关于C语言中最简单错用的指针,更是不能放过:C++的指针被分成数据指针,数据成员指针,函数指针,成员函数指针,并且不能随便彼此转换.并且这些指针的声明格局都不一样:
还有一个更重要的辨别是,指针所占的空间也不一样了.即便在32位系统中,所占的空间也有大概是4字节、8字节、12字节乃至16字节,这个根据平台及编译器,有很大的改变.
固然C++中仍旧有万能指针void*,但它却属于被批斗的对象,并且再也不能“万能”了.它不能转换成成员指针.
这样一来,C++的指针就变得很尴尬:我们需求一种指针可以指向同一范例的数据,不管这个数据是普通数据,还是成员数据;我们更需求一种指针可以指向同一范例的函数,不管这个函数是静态函数,还是成员函数.但是没有,至少从目前的C++尺度中,还没有看到.
自从有了类,我们开始按照 数据+操作 的方法来组织数据构造;自从有了模板,我们又开始把 数据 和 算法 别离,以便重用,实在够折腾人的.但不管怎么折腾,目前大大都函数都不再单身,都嫁给了类,进了围城.但是我们仍旧需求可以安闲调用这些成员函数.
考虑一下windows下的按时调用.SetTimer函数的原型是这样的:
UINT_PTR SetTimer(
HWND hWnd,
UINT_PTR nIDEvent,
UINT uElapse,
TIMERPROC lpTimerFunc
);
此中,参数就不注释了,这个函数预计大大都windows开辟人员都知道.lpTimerFunc是个会被按时调用的函数指针.假定我们不通过WM_TIMER消息来触发按时器,而是通过lpTimerFunc来按时工作,那么我们就只能利用普通函数或静态函数,而无论若何都不能利用成员函数,哪怕通过静态函数转调也不行.
再考虑一下线程的成立:
uintptr_t _beginthread(
void( *start_address )( void * ),
unsigned stack_size,
void *arglist
);
start_address仍旧只支持普通函数.不过这回好了,它答应回调函数一个void*参数,它将会arglist作为参数来调用start_address.于是,聪明的C++程序员,就操纵arglist传送this指针,从而操纵静态函数成功的调用到了成员函数了:
class mythread
{
public:
static void doit(void* pThis)
{
((mythread*)pThis)->doit();
}
void doit(...){}
};
main()
{
...
mythread* pmt = new mythread;
_beginthread(&mythread::doit, 0, (void*)pmt);
...
}
以上是“C++指针探究(三)成员函数指针[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |