C++ this 指針詳解

在前面曾經提到過: 每個對象中的數據成員都分別佔有存儲空間,如果對同一個類定義了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”時,應當對它的含義有正確的理解。
發佈了17 篇原創文章 · 獲贊 7 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章