天天看點

[C/C++] C++ this 指針詳解 [ c++中文網 ]

在前面曾經提到過: 每個對象中的資料成員都分别占有存儲空間,如果對同一個類定義了n個對象,則有n組同樣大小的空間以存放n個對象中的資料成員。但是,不同對象都調用同一個函數代碼段。

那麼,當不同對象的成員函數引用資料成員時,怎麼能保證引用的是所指定的對象的資料成員呢?假如,對于例9.6程式中定義的box類,定義了3個同類對象a,b,c。

如果有a.volume( ) ,應該是引用對象a中的height,width和length,計算出長方體a的體積。

如果有b.volume( ) ,應該是引用對象b中的height,width和length,計算出長方體b的體積。

而現在都用同一個函數段,系統怎樣使它分别引用a或b中的資料成員呢?在每一個成員函數中都包含一個特殊的指針,這個指針的名字是固定的,稱為this指針。它是指向本類對象的指針,它的值是目前被調用的成員函數所在的對象的起始位址。

例如,當調用成員函數a.volume時,編譯系統就把對象a的起始位址賦給this指針,于是在成員函數引用資料成員時,就按照this的指向找到對象a的資料成員。例如volume函數要計算height*width*length的值,實際上是執行:

   (this->height)*(this->width)*(this->length)

由于目前this指向a,是以相當于執行:

   (a.height)*(a.width)*( a.length)

這就計算出長方體a的體積。

同樣如果有b.volume( ) ,編譯系統就把對象b的起始位址賦給成員函數volume的this指針,顯然計算出來的是長方體b的體積。this指針是隐式使用的,它是作為參數被傳遞給成員函數的。

本來,成員函數volume的定義如下:

int box::volume( )

{

   return (height*width*length);

}

c++把它處理為

int box::volume(box *this)

   return (this->height * this->width * this->length);

} 即在成員函數的形參表列中增加一個this指針。

在調用該成員函數時,實際上是用以下方式調用的:

   a.volume(&a);

将對象a的位址傳給形參this指針。然後按this的指向去引用其他成員。

需要說明: 這些都是編譯系統自動實作的,程式設計式者不必人為地在形參中增加this指針,也不必将對象a的位址傳給this指針。在需要時也可以顯式地使用this指針。

例如在box類的volume函數中,下面兩種表示方法都是合法的、互相等價的。

   return (height * width * length); //隐含使用this指針

   return (this->height * this->width * this->length); //顯式使用this指針

可以用*this表示被調用的成員函數所在的對象,*this就是this所指向的對象,即目前的對象。

例如在成員函數a.volume( )的函數體中,如果出現*this,它就是本對象a。上面的return語句也可寫成

   return((*this).height * (*this).width * (*this).length);

注意*this兩側的括号不能省略,不能寫成*this.height。

所謂“調用對象a的成員函數f”,實際上是在調用成員函數f時使this指針指向對象a,進而通路對象a的成員。在使用“調用對象a的成員函數f”時,應當對它的含義有正确的了解。