1. this指針的用處:ios
一個對象的this指針並非對象自己的一部分,不會影響sizeof(對象)的結果。this做用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象自己的地址做爲一個隱含參數傳遞給函數。也就是說,即便你沒有寫上this指針,編譯器在編譯的時候也是加上this的,它做爲非靜態成員函數的隱含形參,對各成員的訪問均經過this進行。 例如,調用date.SetMonth(9) <===> SetMonth(&date, 9),this幫助完成了這一轉換 .web
2. this指針的使用:函數
一種狀況就是,在類的非靜態成員函數中返回類對象自己的時候,直接使用 return *this;另一種狀況是當參數與成員變量名相同時,如this->n = n(不能寫成n = n)。優化
3. this指針程序示例:this
this指針存在於類的成員函數中,指向被調用函數所在的類實例的地址。 根據如下程序來講明this指針 spa
#include<iostream.h> 指針
class Point { int x, y; orm
public: 對象
Point(int a, int b) { x=a; y=b;} 生命週期
void MovePoint( int a, int b){ x+=a; y+=b;}
void print(){ cout<<"x="<<x<<"y="<<y<<endl;}
};
void main( ) {
Point point1( 10,10);
point1.MovePoint(2,2);
point1.print( );
}
當對象point1調用MovePoint(2,2)函數時,即將point1對象的地址傳遞給了this指針。
MovePoint函數的原型應該是 void MovePoint( Point *this, int a, int b);第一個參數是指向該類對象的一個指針,咱們在定義成員函數時沒看見是由於這個參數在類中是隱含的。這樣point1的地址傳遞給了this,因此在MovePoint函數中便顯式的寫成:
void MovePoint(int a, int b) { this->x +=a; this-> y+= b;} 便可以知道,point1調用該函數後,也就是point1的數據成員被調用並更新了值。 即該函數過程可寫成 point1.x+= a; point1. y + = b;
4. 關於this指針的一個經典回答:
當你進入一個房子後,
你能夠看見桌子、椅子、地板等,
可是房子你是看不到全貌了。
對於一個類的實例來講,
你能夠看到它的成員函數、成員變量,
可是實例自己呢?
this是一個指針,它時時刻刻指向你這個實例自己
5. 類的this指針有如下特色:
(1)this只能在成員函數中使用。
全局函數、靜態函數都不能使用this.
實際上,成員函數默認第一個參數爲T * const this。
如:
class A
{
public:
int func(int p)
{
}
};
其中,func的原型在編譯器看來應該是:
int func(A * const this,int p);
(2)因而可知,this在成員函數的開始前構造,在成員函數的結束後清除。
這個生命週期同任何一個函數的參數是同樣的,沒有任何區別。
當調用一個類的成員函數時,編譯器將類的指針做爲函數的this參數傳遞進去。如:
A a;
a.func(10);
此處,編譯器將會編譯成:
A::func(&a,10);
看起來和靜態函數沒差異,對嗎?不過,區別仍是有的。編譯器一般會對this指針作一些優化,所以,this指針的傳遞效率比較高--如VC一般是經過ecx寄存器傳遞this參數的。
(3)幾個this指針的易混問題。
A. this指針是何時建立的?
this在成員函數的開始執行前構造,在成員的執行結束後清除。
可是若是class或者struct裏面沒有方法的話,它們是沒有構造函數的,只能當作C的struct使用。採用 TYPE xx的方式定義的話,在棧裏分配內存,這時候this指針的值就是這塊內存的地址。採用new的方式 建立對象的話,在堆裏分配內存,new操做符經過eax返回分配 的地址,而後設置給指針變量。以後去調 用構造函數(若是有構造函數的話),這時將這個內存塊的地址傳給ecx,以後構造函數裏面怎麼處理請 看上面的回答。
B. this指針存放在何處?堆、棧、全局變量,仍是其餘?
this指針會因編譯器不一樣而有不一樣的放置位置。多是棧,也多是寄存器,甚至全局變量。在彙編級 別裏面,一個值只會以3種形式出現:當即數、寄存器值和內存變量值。不是存放在寄存器就是存放在內 存中,它們並非和高級語言變量對應的。
C. this指針是如何傳遞類中的函數的?綁定?仍是在函數參數的首參數就是this指針?那麼,this指針 又是如何找到「類實例後函數的」?
大多數編譯器經過ecx寄存器傳遞this指針。事實上,這也是一個潛規則。通常來講,不一樣編譯器都會聽從一致的傳參規則,不然不一樣編譯器產生的obj就沒法匹配了。
在call以前,編譯器會把對應的對象地址放到eax中。this是經過函數參數的首參來傳遞的。this指針在調用以前生成,至於「類實例後函數」,沒有這個說法。類在實例化時,只分配類中的變量空間,並無爲函數分配空間。自從類的函數定義完成後,它就在那兒,不會跑的。
D. this指針是如何訪問類中的變量的?
若是不是類,而是結構體的話,那麼,如何經過結構指針來訪問結構中的變量呢?若是你明白這一點的話,就很容易理解這個問題了。
在C++中 ,類和結構是隻有一個區別的:類的成員默認是private,而結構是public。
this是類的指針,若是換成結構,那this就是結構的指針了。
E. 咱們只有得到一個對象後,才能經過對象使用this指針。若是咱們知道一個對象this指針的位置,能夠直接使用嗎?
this指針只有在成員函數中才有定義。所以,你得到一個對象後,也不能經過對象使用this指針。因此,咱們沒法知道一個對象的this指針的位置(只有在成員函數裏纔有this指針的位置)。固然,在成員函數裏,你是能夠知道this指針的位置的(能夠經過&this得到),也能夠直接使用它。
F. 每一個類編譯後,是否建立一個類中函數表保存函數指針,以便用來調用函數?
普通的類函數(不管是成員函數,仍是靜態函數)都不會建立一個函數表來保存函數指針。只有虛函數纔會被放到函數表中。可是,即便是虛函數,若是編譯器能明確知道調用的是哪一個函數,編譯器就不會經過函數表中的指針來間接調用,而是會直接調用該函數。