this 是 c++ 中的乙個關鍵字,也是乙個 const 指標,它指向當前物件,通過它可以訪問當前物件的所有成員。
所謂當前物件,是指正在使用的物件。例如對於stu.show();
,stu 就是當前物件,this 就指向 stu。
友元函式沒有this指標,因為友元不是類的成員。只有成員函式才有this指標。
下面是使用 this 的乙個完整示例:
#include using namespace std;
class student;
void student::setname(char *name)
void student::setage(int age)
void student::setscore(float score)
void student::show()
執行結果:
李華的年齡是16,成績是96.5
this 只能用在類的內部,通過 this 可以訪問類的所有成員,包括 private、protected、public 屬性的。
本例中成員函式的引數和成員變數重名,只能通過 this 區分。以成員函式setname(char *name)
為例,它的形參是name
,和成員變數name
重名,如果寫作name = name;
這樣的語句,就是給形參name
賦值,而不是給成員變數name
賦值。而寫作this -> name = name;
後,=
左邊的name
就是成員變數,右邊的name
就是形參,一目了然。
注意,this 是乙個指標,要用->
來訪問成員變數或成員函式。
this 雖然用在類的內部,但是只有在物件被建立以後才會給 this 賦值,並且這個賦值的過程是編譯器自動完成的,不需要使用者干預,使用者也不能顯式地給 this 賦值。本例中,this 的值和 pstu 的值是相同的。
我們不妨來證明一下,給 student 類新增乙個成員函式printthis()
,專門用來輸出 this 的值,如下所示:
void student::printthis(){
cout《然後在 main() 函式中建立物件並呼叫 printthis():
student *pstu1 = new student;
pstu1 -> printthis();
coutcout《執行結果:
0x7b17d8
0x7b17d8
0x7b17f0
0x7b17f0
可以發現,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...