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 = date._year;
_month = date._month;
_day = date._day;
}
在函式改寫階段,函式被改寫為:
void Test(Date *const this,const Date &date)
{
this->_year = date._year;
this->_month = date._month;
this->_day = date._day;
}
(5)只有在類的非靜態成員函式中才可以使用this指標,其他任何函式都不可以。