NO IMAGE

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

this指標的使用:

一種情況就是,在類的非靜態成員函式中返回類物件本身的時候,直接使用 return *this;另外一種情況是當引數與成員變數名相同時使用this指標,如this->n = n (不能寫成n = n)。

為什麼要有this,this起到什麼作用?話還是要從類和物件說起,定義一個物件,系統要給該物件分配儲存空間,如果該類包含了資料成員和成員函式,就要分別給資料和函式的程式碼分配儲存空間。按照正常額思路,如果類定義了2個物件,那麼就應該分別給這2個物件的資料和函式分配空間。但事實並非如此,C 的編譯系統只用了一段空間來存放在各個共同的函式程式碼段,在呼叫各個物件的成員函式時,都與呼叫這個公共的函式程式碼。因此,每個物件的儲存空間都只是該物件資料成員所佔用的儲存空間,而不包括成員函式程式碼所佔有的空間,函式程式碼是儲存在物件空間之外的。但是問題就出來了,既然所有物件所呼叫的成員函式程式碼只是單獨一封,那麼成員函式是怎麼知道當前呼叫自己的是哪一個物件呢?

  這時就誕生了this這個自引用的指標。每當建立一個物件時,系統就把this指標初始化為指向該物件,即this指標的值為當前呼叫成員函式的物件的起始地址。每當呼叫一個成員函式時,系統就把this指標作為一個隱含的引數傳給該函式。不同的物件呼叫同一個成員函式時,C 編譯器將根據成員函式的this指標所指向的物件來確定應該呼叫哪一個物件的資料成員。通過下面一個簡單例項就可說明。

#include "stdafx.h"
#include <iostream>
#include <string>
class Num
{
private:
int a;
std::string objectName;
public:
Num(std::string objectName,int a);
void showNum();
};
Num::Num(std::string objectName,int a)
{
this->objectName=objectName;
this->a=a;
}
void Num::showNum()
{
std::cout<<this->objectName<<":this="<<this<<" a="<<this->a<<std::endl;
}
int main()
{
Num num1("num1",1);
Num num2("num2",2);
Num num3("num3",3);
num1.showNum();
num2.showNum();
num3.showNum();
return0;
}

結果:

————————————————————————————————-

 

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

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

———————————————————————————————

關於this的若干回答:

1:this只能在成員函式中使用。全域性函式,靜態函式都不能使用this。
2:由此可見,this在成員函式的開始前構造的,在成員的結束後清除。這個生命週期同任一個函式的引數是一樣的,沒有任何區別。   當呼叫一個類的成員函式時,編譯器將類的指標作為函式的this引數傳遞進去。
3:this指標是什麼時候建立的?   this在成員函式的開始執行前構造的,在成員的執行結束後清除。   
4:this指標存放在何處?堆,棧,全域性變數,還是其他?   this指標會因編譯器不同,而放置的位置不同。可能是棧,也可能是暫存器,甚至全域性變數。   
5:this指標如何傳遞給類中函式的?繫結?還是在函式引數的首引數就是this指標.那麼this指標又是如何找到類例項後函式的?   this是通過函式引數的首引數來傳遞的。this指標是在呼叫之前生成的。類例項後的函式,沒有這個說法。類在例項化時,只分配類中的變數空間,並沒有為函式分配空間。自從類的函式定義完成後,它就在那兒,不會跑的。   
6:this指標如何訪問類中變數的/?   如果不是類,而是結構的話,那麼,如何通過結構指標來訪問結構中的變數呢?如果你明白這一點的話,那就很好理解這個問題了。   在C 中,類和結構是隻有一個區別的:類的成員預設是private,而結構是public。   this是類的指標,如果換成結構,那this就是結構的指標了。   
7:我們只有獲得一個物件後,才能通過物件使用this指標,如果我們知道一個物件this指標的位置可以直接使用嗎?   this指標只有在成員函式中才有定義。因此,你獲得一個物件後,也不能通過物件使用this指標。所以,我們也無法知道一個物件的this指標的位置(只有在成員函式裡才有this指標的位置)。當然,在成員函式裡,你是可以知道this指標的位置的(可以&this獲得),也可以直接使用的。   
8:每個類編譯後,是否建立一個類中函式表儲存函式指標,以便用來呼叫函式?   普通的類函式(不論是成員函式,還是靜態函式),都不會建立一個函式表來儲存函式指標的。只有虛擬函式才會被放到函式表中。   但是,即使是虛擬函式,如果編譯器能明確知道呼叫的是哪個函式,編譯器就不會通過函式表中的指標來間接呼叫,而是會直接呼叫該函式