在每個成員函數中都包含一個特殊的指針,即this指針,它的名字是固定的。
this指針是指向當前對象的指針,它的值是當前被調用的成員函數所在對象的起始地址。
例1、
class Student{public: int FunTest(int a, int b) { int c = 0; c = a + b; return c; }PRivate: int age; int tel;};int main(){ int num1=3, num2=4; Student a; a.FunTest(num1,num2);//實際上是a.FunTest(&a,num1,num2) system("pause"); return 0;}此時在主函數定義了一個Student的類對象a,那么此時this指針的值就是該對象a的起始地址。this 指針是隱式使用的,它是作為參數傳遞給成員函數的。如果成員函數從表面上看沒有參數那么實際上他有一個參數,就是this指針,如果成員函數從表面上看有一個參數那么實際上他有兩個參數,就是this指針。
this指針最大作用是指向當前對象然后通過this指針去引用各成員。
這些都是編譯器自動實現的,程序員不需要人為的在成員函數的參數中添加this指針
關于this 指針的類型:類類型 * const
this 指針并不是對象的一部分,因此不影響sizeof的結果。
this 指針的作用域是在非靜態成員函數的內部
this 指針是類成員函數的第一個默認參數,編譯器會自動傳參
只有在類的非靜態成員函數中才可以使用this指針,因為我們知道靜態成員函數是沒有this指針的
有關_thiscall的調用約定
thiscall是唯一一個不能明確指明的函數修飾,因為thiscall不是關鍵字。它是C++類成員函數缺省的調用約定。由于成員函數調用還有一個this指針,因此必須特殊處理,thiscall意味著:
thiscall只能用在類成員函數上
參數從右往左壓棧
如果參數個數確定,this指針通過ecx寄存器傳給被調用者,如果參數不確定this指針在所有參數被壓棧完成之后壓棧
對于參數個數不定的調用者自己清理堆棧否則函數自己清理
為什么叫做this指針而不叫引用呢
其實引用傳參不用創建臨時變量效率高,而用指針傳參同樣會創建臨時變量,但是由于C++就是這么創建的先有的this之后發現用引用可以也來不及改了。
在靜態成員函數中是沒有this指針的。
新聞熱點
疑難解答