對 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);
...
它相當於:
class Student{
public:
int age; int no; int scores;
void initStudent();
void addScore(int score);
}
///this指標是在建立物件前建立.
this指標放在棧上,在編譯時刻已經確定.
並且當一個物件建立後,並且執行整個程式執行期間只有一個this指標.
關於this指標的一個精典回答:
當你進入一個房子後,
你可以看見桌子、椅子、地板等,
但是房子你是看不到全貌了。
對於一個類的例項來說,
你可以看到它的成員函式、成員變數,
但是例項本身呢?
this是一個指標,它時時刻刻指向你這個例項本身。
注意事項:
a.this指標不屬於物件本身的一部分,不會影響sizeof作用於某個類物件的結果,因為sizeof本身也是求物件所對應的類的大小,與物件無關
b.this指標的作用域在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的地址作為一個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在編譯的時候也是加上this的,它作為非靜態成員函式的隱含形參,對各成員的訪問均通過this進行。