当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

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好友分享!
  • 好的评价 如果您觉得此文章好,就请您
      0%(0)
  • 差的评价 如果您觉得此文章差,就请您
      0%(0)

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .