this 是c++中的乙個關鍵字,也是乙個常量指標,指向當前物件(具體說是當前物件的首位址)。通過 this,可以訪問當前物件的成員變數和成員函式。
所謂當前物件,就是正在使用的物件,例如對於stu.say();
,stu 就是當前物件,系統正在訪問 stu 的成員函式 say()。
假設 this 指向 stu 物件,那麼下面的語句中,this 就和 pstu 的值相同:
studentstu; //通過student類來建立物件
student*pstu = &stu;
[示例] 通過 this 來訪問成員變數:
classstudent;
void student::setname(char *name)
void student::setage(int age)
void student::setscore(float score)
本例中,函式引數和成員變數重名是沒有問題的,因為通過 this 訪問的是成員變數,而沒有 this 的變數是函式內部的區域性變數。例如對於this->name = name;
語句,賦值號左邊是類的成員變數,右邊是 setname 函式的區域性變數,也就是引數。
下面是乙個完整的例子:
#include
using namespace std;
classstudent;
void student::setname(char *name)
void student::setage(int age)
void student::setscore(float score)
void student::say()
int main()
執行結果:
小明的年齡是 15,成績是 90.5
李磊的年齡是 16,成績是 80
物件和普通變數類似;每個物件都占用若干位元組的記憶體,用來儲存成員變數的值,不同物件占用的記憶體互不重疊,所以操作物件a不會影響物件b。
上例中,建立物件 stu1 時,this 指標就指向了 stu1 所在記憶體的首位元組,它的值和 &stu1 是相同的;建立物件 stu2 時,this 等於 &stu2;建立物件 stu3 時也一樣。
我們不妨來證明一下,給 student 類新增乙個成員函式,輸出 this 的值,如下所示:
void student::printthis()
然後在 main 函式中建立物件並呼叫 printthis:
studentstu1, *pstu1 = &stu1;
stu1.printthis();
cout<<;
studentstu2, *pstu2 = &stu2;
stu2.printthis();
cout<<;
執行結果:
0x28ff30
0x28ff30
0x28ff10
0x28ff10
可以發現,this 確實指向了當前物件的首位址,而且對於不同的物件,this 的值也不一樣。
幾點注意:
實際上,this 指標是作為函式的引數隱式傳遞的,它並不出現在引數列表中,呼叫成員函式時,系統自動獲取當前物件的位址,賦值給 this,完成引數的傳遞,無需使用者干預。
this 作為隱式引數,本質上是成員函式的區域性變數,不占用物件的記憶體,只有在發生成員函式呼叫時才會給 this 賦值,函式呼叫結束後,this 被銷毀。
正因為 this 是引數,表示物件首位址,所以只能在函式內部使用,並且物件被例項化以後才有意義。
在《c++函式編譯原理和成員函式的實現》一節中講到,成員函式最終被編譯成與物件無關的普通函式,除了成員變數,會丟失所有資訊,所以編譯時要在成員函式中新增乙個額外的引數,把當前物件的首位址傳入,以此來關聯成員函式和成員變數。這個額外的引數,實際上就是 this,它是成員函式和成員變數關聯的橋梁。
c this 指標詳解
首先來觀察一段 class myclass int data const void tmyclass 我們知道類的成員函式在記憶體只有乙份拷貝,而類的資料成員 不考慮靜態成員 是每個物件都有自己的乙份,所以上述 中obj1和obj2呼叫data函式是同乙個函式,但它們擁有各自的資料,所以輸出結果為0...
C this指標詳解
this 是c 中的乙個關鍵字,也是乙個常量指標,指向當前物件 具體說是當前物件的首位址 通過 this,可以訪問當前物件的成員變數和成員函式。所謂當前物件,就是正在使用的物件,例如對於stu.say stu 就是當前物件,系統正在訪問 stu 的成員函式 say 假設 this 指向 stu 物件...
C this指標詳解
this 是 c 中的乙個關鍵字,也是乙個 const 指標,它指向當前物件,通過它可以訪問當前物件的所有成員。所謂當前物件,是指正在使用的物件。例如對於stu.show stu 就是當前物件,this 就指向 stu。下面是使用 this 的乙個完整示例 include using namespa...