天天看點

《C++面向對象高效程式設計(第2版)》——2.16 識别成員函數的目标對象

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第章,第2.16節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

在編寫成員函數(構造函數、析構函數、操作符等)的代碼時,如何顯式表示調用該成員函數的對象?或者,如果需要,如何顯式傳回目标對象(target object)的值?在成員函數内部,如何通路調用該成員函數的對象中的資料成員?

這就是this指針發揮作用的地方。類的每個成員函數都有一個特殊的指針——this。這個this指針内含調用成員函數的對象的位址(即this指針總是指向目标對象)。this指針隻在成員函數内部有效,this是c++中的關鍵字。

this指針的類型是“指向成員函數所屬類的指針”,也可以說“this的類型是類名”。在成員函數内部,this指針指向調用該成員函數的類執行個體。

編譯器對待成員函數并沒有什麼特别。實際上,編譯器就像實作普通函數那樣實作成員函數,但是,它會專門對成員函數進行名稱重整(name mangling)以確定其唯一性。每個成員函數接受的第一個參數就是this指針。盡管程式員從未顯式聲明this指針,但是它一定存在。this指針通常是每個(非靜态)成員函數隐含的第一個參數,編譯器在每個成員函數的聲明中都會插入這個隐含的參數。為了說明這個概念,顯式聲明this指針如下,print()成員函數應是:

void print_3tintfv(const tint* this)

{

  cout << "0x" << this->_mostsignificantpart << ", 0x" <<

          this->_leastsignificantpart;

}<code>`</code>

一旦離開成員函數,this名稱将不再有效。

hand是否一定要使用this指針來引用目标對象中的成員?

不是所有情況都需要這樣做。隻有在成員函數使用該類成員(資料成員或成員函數)的非限定(unqualified name)名時,才意味着使用this指針。如果在成員函數内部引用類的成員,編譯器會在每條表達式中均插入this指針(如果使用者沒有這樣做)。回顧print()函數,可以這樣改寫:

tint aint;

aint.print();<code>`</code>

對象aint調用print()(即向對象aint發送print()消息)。在print()函數中this指針将指向aint。

由于this是指向對象的指針,是以,如果要使用this指針獲得整個對象,我們必須使用操作符對<code>this</code>指針解引用(<code>de-reference</code>)為<code>*this</code>。正如其他指針那樣,<code>this</code>内部存放的是對象的位址,this則是該對象的值。

this指針的概念非c++獨享。oop語言在涉及接收消息的對象時,使用不同的名稱。如<code>smalltalk</code>稱為<code>self</code>,eiffel稱之為<code>current</code>。

c++:

現在,把我們的注意力轉到tint類的一些操作符函數上。

繼續閱讀