1. 程式人生 > >對 this 指標的理解和作用

對 this 指標的理解和作用

this指標只能在一個類的成員函式中呼叫,它表示的是當前物件的地址。

1. this只能在成員函式中使用。
全域性函式,靜態函式都不能使用this。
實際上,成員函式預設第一個引數為T* const register this。
如: 
class A

{

public: 

      int func(int p)

      {}

};

其中,func的原型在編譯器看來應該是: int func(A* const register this, int p);

2. 當對一個物件呼叫成員函式時,編譯程式先將物件的地址賦給this指標,然後呼叫成員函式,每次成員函式存取資料成員時,由隱含使用this指標。


3. 當一個成員函式被呼叫時,自動向它傳遞一個隱含的引數,該引數是一個指向這個成員函式所在的物件的指標。 
4. 在C++中,this指標被隱含地宣告為: X *const this,這意味著不能給this 指標賦值;
   在X類的const成員函式中,this指標的型別為:const X* const, 這說明this指標所指向的這種物件是不可修改的(即不能對這種物件的資料成員進行賦值操作); 
5. 由於this並不是一個常規變數,所以,不能取得this的地址。

    為什麼需要this?

因為this作用域是在類的內部,自己宣告一個類的時候,還不知道例項化物件的名字,所以用this來使用物件變數的自身。在非靜態成員函式中,編譯器在編譯的時候加上this作為隱含形參,通過this來訪問各個成員(即使你沒有寫上this指標)。

舉一個現成的例子:

 class A{
     int n;
public:
    static void run(void* pThis)

   {
       A* this_ = (A*)pThis;
       this_->process();
   }
    void process(){}
};

main(){
     A a;
    _beginthread( A::run, 0, &a );
}


這裡就是定義一個靜態函式來模擬成員函式。

也有許多C語言寫的程式,模擬了類的實現。如freetype庫等等。
其實,有用過C語言的人,大多都模擬過。只是當時沒有明確的概念罷了。
如:

typedef struct student{
   int age;
   int no;
   int scores;
}Student;
void initStudent(Student* pstudent);
void addScore(Student* pstudent, int score);
...

如果你把 pstudent改成this,那就一樣了。

它相當於:

class Student{
public:
    int age; int no; int scores;
    void initStudent();
    void addScore(int score);
}

const常量可以有物理存放的空間,因此是可以取地址的

///this指標是在建立物件前建立.
this指標放在棧上,在編譯時刻已經確定.
並且當一個物件建立後,並且執行整個程式執行期間只有一個this指標.


關於this指標的一個精典回答:

當你進入一個房子後,
你可以看見桌子、椅子、地板等,
但是房子你是看不到全貌了。
對於一個類的例項來說,
你可以看到它的成員函式、成員變數,
但是例項本身呢?
this是一個指標,它時時刻刻指向你這個例項本身。

注意事項:

a.this指標不屬於物件本身的一部分,不會影響sizeof作用於某個類物件的結果,因為sizeof本身也是求物件所對應的類的大小,與物件無關

b.this指標的作用域在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。