C this指標詳解(精闢)

2021-09-26 04:22:24 字數 1791 閱讀 2445

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...