1. 程式人生 > >m_hWnd 與 C++中的this指標

m_hWnd 與 C++中的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),因為在類裡已經封裝好了,所以也不需要在傳遞引數了。



② 哪如何獲得視窗類的自己的控制代碼呢?有如下方法:
1、this->m_hWnd;
2、GetSafeHwnd();
3、AfxGetMainWnd()->m_hWnd;

(二)關於this指標,有必要分析一下:
① 對於類成員函式而言,並不是一個物件對應一個單獨的成員函式體,而是此類的所有物件共用這個成員函式體,即呼叫同一個程式碼段。當程式被編譯之後,此成員函式地址即已確定。而成員函式之所以能把屬於此類的各個物件的資料區別開, 就是靠this指標,也就是對於每一個類的非靜態成員函式,都有一個隱含的this指標,該指標指向呼叫該成員函式的例項物件。

  ② 一個物件的this指標並不是物件本身的一部分,不會影響sizeof
("物件")的結果;它
是一個隱含於每一個類的成員函式中的特殊指標。它指向正在被該成員函式操作的那個物件。

   當對一個物件呼叫非靜態成員函式時,編譯程式會自動先將物件的地址賦給成員函式的this指標,即作為一個隱含引數傳遞給成員函式;然後每次非靜態成員函式存取非靜態資料成員時,由隱含使用this指標,即都會被轉化為this->資料成員的方式。

 ③ 在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進行訪問了,只要在函式名字前加上類名限定符即可,這也就是為什麼靜態函式無法訪問非靜態成員了(沒有物件指標,如何訪問其成員變數?),靜態成員函式自然能訪問靜態成員變數。因此說:靜態成員變數實際上就是一種有訪問限制的全域性變數而已。從類的外部訪問靜態成員變數,前面需要加上類名限定符。