在前面曾經提到過: 每個對象中的資料成員都分别占有存儲空間,如果對同一個類定義了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”時,應當對它的含義有正确的了解。