在CWnd类中,既然m_hWnd 是一个公有变量,为什么还要设一个函数GetSafeHwnd()来返回这个变量啊?调用这个函数与直接操作m_hWnd句柄有什么区别吗?如果没区别的话,GetSafeHwnd()这个函数就显得多余了,函数调用可是占用系统开销的啊,频繁调用可能会影响系统性能啊。MFC为什么还增加这个方法呢?发现很多人也喜欢用这个方法呢。

解决方案 »

  1.   

    GetSafeHwnd只是检查句柄是否存在,以免发生异常。
      

  2.   

    CWnd::GetSafeHwnd  
    HWND GetSafeHwnd( ) const;Return ValueReturns the window handle for a window. Returns NULL if the CWnd is not attached to a window or if it is used with a NULL CWnd pointer. 
      

  3.   

    GetSafeHwnd是内联的,不存在你所说的开销!
    在AFXWIN2.INL中定义如下_AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const
    { return this == NULL ? NULL : m_hWnd; }这样做只是为了安全检查,如果你的CWnd(子)对象没有挂载窗口时,使用m_hWnd调用成员函数可能会出错
      

  4.   

    3楼说的有道理,我没注意到GetSafeHwnd是个内联函数。性能上影响不大了。
    可是
    _AFXWIN_INLINE HWND CWnd::GetSafeHwnd() const 
    { return this == NULL ? NULL : m_hWnd; } 
    中的判断好像也不好理解啊,return 语句能够执行的话,this指针肯定不为空啊,因为执行return语句的就是this指针指向的对象啊,没有这个对象,这条语句没有执行者啊。所以,这个return语句跟 return m_hWnd;没什么区别啊。
    还有CWnd(子)对象如果没有挂载窗口时调用这个函数也不能保证获得一个安全的窗口句柄啊,因为这个时候,this指针指向了一个对象,肯定不为空啊,那return语句却返回m_hWnd的值,此时没有加载窗口,返回的m_hWnd的值就不是安全的句柄了。不是吗?
      

  5.   

    如果this的值是NULL,那么this->m_hWnd就会产生异常(非法操作)了,在使用指针前为了安全起见先检查指针是否为空,GetSafeHwnd就是替你做这件事。只要你可以确定你不会使用空指针来访问类,就用不着GetSafeHwnd。
      

  6.   

    如果this的值是NULL,那么this->m_hWnd就会产生异常,这肯定是没错的。可是如果this的值是NULL了,你的GetSafeHwnd由谁来执行?这个函数总得有一个对象来执行它吧。
      

  7.   

    GetSafeHwnd能获得执行的话,this指针肯定不会为空。不是吗?
      

  8.   

    GetSafeHwnd()函数内会检查this指针是否为空
      

  9.   

    晕死了,为什么大家只知道说GetSafeHwnd()函数内会检查this指针是否为空而不仔细的看清我的问题呢?我的问题是,你检查this指针之前首先得进入GetSafeHwnd()这个函数来执行它吧?没有一个对象调用这个函数,这个函数是不会执行的。在任何一个类的成员函数里调用另一个成员函数,不管第二个函数是不是从祖先类继承下来还是本身定义的,调用的形式其实都隐式的使用了this指针的。例如,在类A中有两个成员函数Fun1和Fun2,其中Fun2调用Fun1.
    void A::Fun2()
    {
        Fun1(); //这里其实隐含了this指针,跟this->Fun1()没有区别的;
    }难道this为NULL,不能通过它访问成员变量却能调用成员函数?
      

  10.   

    调用一般成员函数是不需要使用类指针的,只是把类指针作为参数传递过去。但如果是虚函数则需要类指针了。
    LZ可以试一下,例如:
    A* p = NULL;
    p->Fun()
    只要Fun不是虚函数且没有访问类成员,是不会有问题的。
      

  11.   

    就像对话框一样,new出一个对话框,获得的指针可以操作GetSafeHwnd,以及create函数等,但是如果没有创建对话框窗口的话,hwnd就为零了;