1. 程式人生 > >c++類中的this指標

c++類中的this指標

         當我們進入一個房子之後可以看見房子裡的桌子、椅子、地板等,但是看不到房子的全貌。

         對於一個類的例項來說,你可以看到看到他的成員函式,成員變數,但是例項本身呢,就像你想要看到房子裡的東西,要先找到房子一樣,想要訪問例項裡的成員,就先要找到此例項,那麼為了實現這個願望,c++定義了一個指標,this指標,他時時刻刻都指向這個例項

我們可以通過反彙編來理解這個情況。

現在有一個日期類:

class Date
{
public :
Date(int year = 2016,int month = 10,int day = 15)
:_year(year)
,_month(month)
,_day(day)
{}
Date(const Data& date)
:_year(data._year)
,_month(data._month)
,_day(data._day)
{}

void Print()
{
cout<<this<<endl;
}
private :
int _year;
int _month;
int _day;
};

進行例項化 建立類的物件d:


Date d(2015,02,03);

反彙編程式碼為:

  push        3  
  push        2  
  push        7DFh  
  lea         ecx,[d]  (將d取有效地址給暫存器ecx)
  call        Data::Data (011111A4h)  

F11紅色指令後:

mov         dword ptr [this],ecx,

將ecx的值賦給this,及this指向例項d。

this指標特性

(1):型別Date* const
假設this指向物件d,那麼一下*pdate與this值相同:

Date *pdate = &Data,

這說明this為一個型別為Data的指標,建立例項d1,d2,d3;分別呼叫print成員函式:

       Date d1;
d1.Print();
Data d2;
d2.Print();
Data d3;
d3.Print();

得結果:00D4FA0C

                        00D4F9F8

00D4F9E4

可以發現,this指標指向每個例項的首地址,且對於不同物件,this指標值不同。

以上,可知型別Date* const

(2):this指標並不是對像的本身的一部分,不影響sizeof的結果

對於以上日期類

函式存於程式碼段區域

sizeof結果為12


(3)this指標的作用域在類成員函式的內部

可將this定義在類成員函式外部進行測試

(4)this指標是類成員函式的第一個預設隱含引數,編譯器自動維護傳遞,類編寫者不能顯示傳遞。

如上日期類中的print函式,看起來時無參的,其實編譯器會給其一個隱含引數”Data *const  this“

反彙編如下:

d1.Print();
  lea         ecx,[d1]  
 call        Data::Print (0E9144Ch)  

F11紅色指令:

mov         dword ptr [this],ecx

可見。

且若在類中加入以下成員函式:

void Test(const Date& date)
{
_year = dat
e._year;
_month = dat
e._month;
_day = dat
e._day;
}

在函式改寫階段,函式被改寫為:

void Test(Date *const this,const Date &date)

{

this->_year = date._year;

this->_month = date._month;

this->_day = date._day;

}

(5)只有在類的非靜態成員函式中才可以使用this指標,其他任何函式都不可以。