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進行訪問了,只要在函數名字前加上類

 

名限定符即可,這也就是為什么靜態函數無法訪問非靜態成員了(沒有對象指針,如何訪問

 

其成員變量?),靜態成員函數自然能訪問靜態成員變量。因些說:靜態成員變量實際上就

 

是一種有訪問限制的全局變量而已。從類的外部訪問靜態成員變量,前面需要加上類名限定

 

符。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM