C++中this指針的用法

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指針有如下特色:

1this只能在成員函數中使用。

全局函數、靜態函數都不能使用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裏面沒有方法的話,它們是沒有構造函數的,只能當作Cstruct使用。採用 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. 每一個類編譯後,是否建立一個類中函數表保存函數指針,以便用來調用函數?

普通的類函數(不管是成員函數,仍是靜態函數)都不會建立一個函數表來保存函數指針。只有虛函數纔會被放到函數表中。可是,即便是虛函數,若是編譯器能明確知道調用的是哪一個函數,編譯器就不會經過函數表中的指針來間接調用,而是會直接調用該函數。

相關文章
相關標籤/搜索