this指針是在實例化一個對象後產生的,並且指向對象本身.
類的this指針有如下特點:
(1) this只能在成員函數中使用.
全局函數,靜態函數都不能使用this.
實際上,成員函數默認第一個參數爲T* const this
如: class A{public: int func(int p){]};
其中,func的原型在編譯器看來是: int func(A* const this, int p);
(2) this 在成員函數的開始前構造,在成員函數結束後清除.
(3) this指針會根據編譯器不同而有不同的放置位置.可能是棧,也可能是寄存器,甚至全局變量. 在彙編級別裏,一個值只會以3種形式出現:立即數,寄存器和內存變量值.
(4) this指針是如何傳遞給類中的函數的? this指針又是如何找到"類實例後函數"的?
大多數編譯器通過ecx寄存器來傳遞this指針.
在call之前,編譯器會把對應的對象地址放到eax 中.this是通過函數參數的首參數來傳遞的.this指針在調用之前生成,至於"類實例後函數"沒有這個說法.類在實例化時,只分配類中的變量空間,並沒有爲函數分配空間.自從類的函數定義完成後,它就在那兒,不會跑的.
(5) 在獲得一個對象後,能不能通過對象使用this指針?
this指針只有在成員函數中才有定義.因此,你獲得一個對象後,也不能通過對象使用this指針.所以,我們無法知道一個對象的this指針的位置,當然,在成員函數裏,你是可以知道this指針的位置的(可以通過&this獲得),也可以直接使用它.
(6) 普通的類函數(無論是成員函數,還是靜態函數)都不會創建一個函數表來保存函數指針.
只有虛函數纔會放到函數表中,即使是虛函數,如果編譯器能明確知道調用的是哪個函數,編譯器就不會通過函數表中的指針來間接調用,而是會直接調用該函數.