物件和類(二) this 指標

2021-06-21 15:31:21 字數 2539 閱讀 9301

當你進入乙個房子後,

你可以看見桌子、椅子、地板等,

但是房子你是看不到全貌了。

對於乙個類的例項來說,

你可以看到它的成員函式、成員變數,

但是例項本身呢?

this

是乙個指標,它時時刻刻指向你這個例項本身。

this只能在成員函式中使用,

this在成員函式的開始前構造的,在成員的結束後清除。

前面我們所學的成員函式都只涉及乙個物件,即呼叫它的物件,所以接觸到this指標的機會不多,但有時候有的成員函式或方法要涉及到2個物件或者多個物件的時候,我們就要用到c++的this指標。

使用this指標時應注意的3點:

第一,this指標為什麼沒有定義就能直接使用,答案是編譯器定義了

第二,this指標是乙個函式引數,所以它的使用範圍僅在成員函式內部

第三,this指標為什麼指向物件?呼叫時偷偷把物件位址給它傳遞過去了

下面直接看具體的例子:

#include using namespace std;

class a

void set(int x)

這段**的意思是,如果s.total_val大於total_val,則函式將返回指向s的引用;否則,將返回用來呼叫該方法的物件。this指標指向用來呼叫成員函式的物件。

那麼,當不同物件的成員函式引用資料成員時,怎麼能保證引用的是所指定的物件的資料成員呢?例如:

如果有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( )

c++把它處理為

int box::volume(box *this)

即在成員函式的形參表列中增加乙個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」時,應當對它的含義有正確的理解。

從上面可以得出:

month=mn;

this->month=mn;

(*this).month=mn;

//這三句是等價的

指標物件(類和物件實驗二)

第一行輸入需要n個測試物件 每行依次輸入各物件的屬性 輸出排好序後的物件姓名屬性,每行乙個 2tom 男 2012222222 計算機學院 13333333333 john 男 2013333333 計算機學院 12444444444 john tom my code include using n...

類物件和類指標

宣告 類物件 利用類的建構函式在記憶體中分配一塊記憶體,呼叫了建構函式 類指標 是乙個記憶體位址值,指向記憶體中存放的類物件,沒有呼叫建構函式 引用成員 物件用 指標用 物件生命期 若是成員變數,則是類的析構函式來釋放空間 若是函式中的臨時變數,則作用域是該函式體內 指標生命期 則需利用delete...

類物件和類指標區別

類物件和類指標 本文 student a s.setname a studeng b new student student b b new student b setname b 分析 定義類物件基本格式是 student a 在定義之後就已經為a這個物件分配了記憶體,且為記憶體棧 定義類指標基本...