天天看點

C++學習筆記(this指針)

首先,要了解什麼是指針?簡單的說指針就是位址。例如int a=3;定義整型變量a,并給a賦初值為3。在定義a的時候,系統會為變量a配置設定記憶體,記憶體是有位址的,就像每個房間都有自己的房間号一樣。這裡我們假設a的位址為0xf0,接着定義指針變量int *p=&a;表明指針變量p存放的是a的位址(0xf0)。是以,指針變量就是用來存放位址的變量。在C++中提供了類,假設定義了如下的類:

#include<iostream>

using namespace std;

class Test

{

public:

Test(int d)//構造函數

{

data=d;

}

void show()//成員函數

{

cout<<data<<endl;

}

private:

int data;

};

int main()

{

Test t1(10);//調用構造函數

Test t2(20);//調用構造函數

t1.show();//調用成員函數

t2.show();//調用成員函數

}

在主程式的第三行,通過對象調用成員函數來顯示data;運作結果如下:

C++學習筆記(this指針)

現在,我們将程式改為如下的形式:

#include<iostream>

using namespace std;

class Test

{

public:

Test(int data)//構造函數,形參與私有資料同名

{

data=data;

}

void show()//成員函數

{

cout<<data<<endl;

}

private:

int data;

};

int main()

{

Test t1(10);//調用構造函數

Test t2(20);//調用構造函數

t1.show();//調用成員函數

t2.show();//調用成員函數

}

上述程式中,成員函數show的形參與類的私有資料同名了,在執行data=data的時候,程式并不知道如何指派,程式的執行結果會發生錯誤,那麼如何進行修改呢?一種方法是将形參的名稱修改,保證其不與私有資料同名即可;另外一種方法則是加入this指針,這裡我們先給出修改後的程式,然後再做解釋。

#include<iostream>

using namespace std;

class Test

{

public:

Test(int data)//構造函數,形參與私有資料同名

{

this->data=data;

}

void show()//成員函數

{

cout<<data<<endl;

}

private:

int data;

};

int main()

{

Test t1(10);//調用構造函數

Test t2(20);//調用構造函數

t1.show();//調用成員函數

t2.show();//調用成員函數

}

這個時候,程式能夠正常的運作,并輸出正确的結果,這是什麼原因呢?我們在通過對象調用成員函數的時候:t1.show();該函數會被改寫為show(&t),是以,調用該函數會傳遞一個位址給形參,但是我們看到的show函數并沒有形參,這是怎麼回事呢?原來成員函數在定義的時候,都會有一個預設的形參,在本程式中,形參為Test *const this;是以,show函數實際為:void show(Test *const this);this指針用來接受t1對象的位址,this->dada=data;自然就是用10來給this所指向的對象的data指派。我們知道成員函數必須由對象來進行調用,我們可以這麼了解,在用對象調用成員函數的時候,都會向成員函數傳遞一個位址(對象的位址),是以,我們在程式中看到的成員函數的形參都含有一個this指針(程式沒有顯示的寫出來),例如:

void show()應該是:void show(Test *const this);是以,我們表面上看到的成員函數形參的個數比實際形參的個數少一個。假設我們已經定義了Student類,包含以下的成員函數:

void show();

void caculate(int a,int b,int c);

在程式内部,該函數實際為:

void show(Student *const this);

void caculate(Student *const this,int a,int b,int c);

假設在用對象調用上述兩個成員函數:

stu1.show();

stu.caculate(10,20,15);

在程式内部該調用形式會被改寫為:

show(&stu1);

show(&stu1,10,20,15);

由上可知,成員函數中都含有this指針,且形式為:類名 *const this;位于成員函數的第一個形參的位置。在用對象調用成員函數的時候,第一個參數即為對象的位址。