zoukankan      html  css  js  c++  java
  • MFC m_hWnd 和 this指针

    m_hWnd 和 this指针

     

    m_hWnd

     

    ① m_hWnd这个成员变量,最早是定义在类CWnd中,而且是类CWnd的第一个数据成员,

     

    先看一下MSDN的解析: 

     

    The handle of the Windows window attached to this CWnd. The m_hWnd data member is a

     

    public variable of type HWND.

     

    由此可知,它是窗口类的一个句柄,凡是从CWnd派生的类都有这个句柄,凡是以CWnd

     

    生的类定义的对象内部也都有这个句柄,它是类或者对象标识自己的句柄。

     

    凡是窗口都有一个句柄用来标识自己,在CWnd类中将这个句柄作为一个成员变量直接封装

     

    了,所以CWnd类的成员函数都没有句柄这个参数了,比如::ShowWindow(HWND hWnd),

     

    CWnd类或者派生类中,这个函数就没有参数了,CWnd::ShowWindow(),其实这个函数实

     

    现很简单,就是调用了::ShowWindow(HWND hWnd),因为在类里已经封装好了,所以也不需

     

    要在传递参数了。

     

     

     

    ② 哪如何获得窗口类的自己的句柄呢?有如下方法:

     

    1this->m_hWnd;

     

    2GetSafeHwnd();

     

    3AfxGetMainWnd()->m_hWnd;

     

     

     

    this

     

      ① 对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对

     

    象共用这个成员函数体,即调用同一个代码段

     

       当对一个对象调用非静态成员函数时,编译程序会自动先将对象的地址赋给成员函数的

     

    this指针,即作为一个隐含参数传递给成员函数;然后每次非静态成员函数存取非静态数据

     

    成员时,由隐含使用this指针,即都会被转化为this->数据成员的方式。

     

    。当程序被编译之后,此成员函数地址即已确

     

    定。而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠this指针,也就是对

     

    于每一个类的非静态成员函数,都有一个隐含的this指针,该指针指向调用该成员函数的实

     

    例对象。

     

     

     

      ② 一个对象的this指针并不是对象本身的一部分,不会影响sizeof("对象")的结果;它是一

     

    个隐含于每一个类的成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。

     

     

     

     ③ 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;在X

     

    类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对

     

    象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

     

     ④ 由于this并不是一个常规变量,所以,不能取得this的地址。

     

     

     

     ⑤显式引用this指针的地方:

     

    1、在类的非静态成员函数中返回类对象本身的时候,直接使用

     

     return *this

     

    2、为避免对同一对象进行赋值操作,例如在重载运算符"="时,如:

     

    ClassText& operator = (const ClassText& instance)

     

    {

     

       if(this == &instance) {       return *this;

     

       }

     

       m_nSize = instance.m_nSize;

     

       if(NULL != m_pBuffer) {

     

          delete [] m_pBuffer;

     

       }

     

       m_pBuffer = new char[MAX_PATH];

     

       if(NULL != m_pBuffer ) {

     

          strncpy(m_pBuffer, instance.m_pBuffer, MAX_PATH);

     

       }

     

       return *this;

     

    }

     

    3、当形式参数与成员变量名相同时,如

     

    this->n = n (不能写成n = n),否则无法实现对成员

     

    变量的赋值操作;

     

     

     

      当然了,对于静态成员的访问,就不需要通过this进行访问了,只要在函数名字前加上类

     

    名限定符即可,这也就是为什么静态函数无法访问非静态成员了(没有对象指针,如何访问

     

    其成员变量?),静态成员函数自然能访问静态成员变量。因些说:静态成员变量实际上就

     

    是一种有访问限制的全局变量而已。从类的外部访问静态成员变量,前面需要加上类名限定

     

    符。

    m_hWnd 和 this指针

     

    m_hWnd

     

    ① m_hWnd这个成员变量,最早是定义在类CWnd中,而且是类CWnd的第一个数据成员,

     

    先看一下MSDN的解析: 

     

    The handle of the Windows window attached to this CWnd. The m_hWnd data member is a

     

    public variable of type HWND.

     

    由此可知,它是窗口类的一个句柄,凡是从CWnd派生的类都有这个句柄,凡是以CWnd

     

    生的类定义的对象内部也都有这个句柄,它是类或者对象标识自己的句柄。

     

    凡是窗口都有一个句柄用来标识自己,在CWnd类中将这个句柄作为一个成员变量直接封装

     

    了,所以CWnd类的成员函数都没有句柄这个参数了,比如::ShowWindow(HWND hWnd),

     

    CWnd类或者派生类中,这个函数就没有参数了,CWnd::ShowWindow(),其实这个函数实

     

    现很简单,就是调用了::ShowWindow(HWND hWnd),因为在类里已经封装好了,所以也不需

     

    要在传递参数了。

     

     

     

    ② 哪如何获得窗口类的自己的句柄呢?有如下方法:

     

    1this->m_hWnd;

     

    2GetSafeHwnd();

     

    3AfxGetMainWnd()->m_hWnd;

     

     

     

    this

     

      ① 对于类成员函数而言,并不是一个对象对应一个单独的成员函数体,而是此类的所有对

     

    象共用这个成员函数体,即调用同一个代码段

     

       当对一个对象调用非静态成员函数时,编译程序会自动先将对象的地址赋给成员函数的

     

    this指针,即作为一个隐含参数传递给成员函数;然后每次非静态成员函数存取非静态数据

     

    成员时,由隐含使用this指针,即都会被转化为this->数据成员的方式。

     

    。当程序被编译之后,此成员函数地址即已确

     

    定。而成员函数之所以能把属于此类的各个对象的数据区别开, 就是靠this指针,也就是对

     

    于每一个类的非静态成员函数,都有一个隐含的this指针,该指针指向调用该成员函数的实

     

    例对象。

     

     

     

      ② 一个对象的this指针并不是对象本身的一部分,不会影响sizeof("对象")的结果;它是一

     

    个隐含于每一个类的成员函数中的特殊指针。它指向正在被该成员函数操作的那个对象。

     

     

     

     ③ 在C++中,this指针被隐含地声明为: X *const this,这意味着不能给this 指针赋值;在X

     

    类的const成员函数中,this指针的类型为:const X* const, 这说明this指针所指向的这种对

     

    象是不可修改的(即不能对这种对象的数据成员进行赋值操作);

     

     ④ 由于this并不是一个常规变量,所以,不能取得this的地址。

     

     

     

     ⑤显式引用this指针的地方:

     

    1、在类的非静态成员函数中返回类对象本身的时候,直接使用

     

     return *this

     

    2、为避免对同一对象进行赋值操作,例如在重载运算符"="时,如:

     

    ClassText& operator = (const ClassText& instance)

     

    {

     

       if(this == &instance) {       return *this;

     

       }

     

       m_nSize = instance.m_nSize;

     

       if(NULL != m_pBuffer) {

     

          delete [] m_pBuffer;

     

       }

     

       m_pBuffer = new char[MAX_PATH];

     

       if(NULL != m_pBuffer ) {

     

          strncpy(m_pBuffer, instance.m_pBuffer, MAX_PATH);

     

       }

     

       return *this;

     

    }

     

    3、当形式参数与成员变量名相同时,如

     

    this->n = n (不能写成n = n),否则无法实现对成员

     

    变量的赋值操作;

     

     

     

      当然了,对于静态成员的访问,就不需要通过this进行访问了,只要在函数名字前加上类

     

    名限定符即可,这也就是为什么静态函数无法访问非静态成员了(没有对象指针,如何访问

     

    其成员变量?),静态成员函数自然能访问静态成员变量。因些说:静态成员变量实际上就

     

    是一种有访问限制的全局变量而已。从类的外部访问静态成员变量,前面需要加上类名限定

     

    符。

  • 相关阅读:
    BZOJ3697: 采药人的路径
    解题:WC 2007 石头剪刀布
    解题:CQOI 2017 老C的方块
    解题:洛谷4314 CPU监控
    解题:CQOI 2017 老C的任务
    解题:CF1009 Dominant Indices
    解题:CF570D Tree Requests
    解题:APIO 2012 派遣
    解题:ZJOI 2015 幻想乡战略游戏
    解题:洛谷4178 Tree
  • 原文地址:https://www.cnblogs.com/jack-jia-moonew/p/4236337.html
Copyright © 2011-2022 走看看