C++之this指針

首先來看一個案例:
class Stock
{
private:
int date;
public:
Stock();
~Stock();
const Stock& topval(const Stock& st) const;
}

//比較那個對象的date大,返回那個對象
const Stock& Stock::topval(const Stock& st) const
{
if(st.date > date)
return st; //argument object;
else
return ???; //invoking object;
}

以上我們可以發現不知如何稱呼調用該方法的對象。
C++提供瞭解決此類問題的方法,使用被稱爲 this 的特殊指針。this用來指向成員函數的對象(this被作爲隱藏參數傳遞給方法)。
實際上,成員函數默認第一個參數爲T* const register this。
因此const Stock& topval(const Stock& st) const;原型在編譯器看來爲:
const Stock& topval(Stock* const register this, const Stock& st) const;
由此可見,this在成員函數的開始前構造的,在成員的結束後清除。這個生命週期同任一個函數的參數是一樣的,沒有任何區別。
當調用一個類的成員函數時,編譯器將類的指針作爲函數的this參數傳遞進去。如:
Stock a;
Stock b;
a.topval(b) const;
此處,編譯器將會編譯成: const Stock& Stock::a.topval(&a, b) const;
編譯器通常會對this指針做一些優化的,因此,this指針的傳遞效率比較高--如vc通常是通過ecx寄存器來傳遞this參數。
經過以上分析後可以將*this作爲調用對象的別名來完成前面的定義:
const Stock& Stock::topval(const Stock& st) const
{
if(st.date > date)
return st; //argument object;
else
return *this; //invoking object;
}

總結
1)this在成員函數的開始執行前構造的,在成員的執行結束後清除。
2)this指針會因編譯器不同,而放置的位置不同。可能是棧,也可能是寄存器,甚至全局變量。
3)this是通過函數參數的首參數來傳遞的。this指針是在調用之前生成的。類實例後的函數,沒有這個說法。類在實例化時,只分配類中的變量空間,並沒有爲函數分配空間。自從類的函數定義完成後,它就在那兒,不會跑的。
4)在C++中,類和結構是隻有一個區別的:類的成員默認是private,而結構是public。
this是類的指針,如果換成結構,那this就是結構的指針了。
5)this指針只有在成員函數中才有定義。因此,你獲得一個對象後,也不能通過對象使用this指針。所以,我們也無法知道一個對象的this指針的位置(只有在成員函數裏纔有this指針的位置)。當然,在成員函數裏,你是可以知道this指針的位置的(可以&this獲得),也可以直接使用的。

發佈了47 篇原創文章 · 獲贊 24 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章