首先思考一下在c++中,編譯器是如何識别一個類的?
識别一個類可以分為一下三步?
①識别類名;
②識别資料成員;
③識别成員函數并将其改寫。
引出的問題:類中的資料成員相當于全局變量,但是全局變量在使用之前,必須先定義,而類中的資料成員的位置可以任意,這就是因為識别類時的順序而導緻的差別。
我們都知道類中成員函數和資料成員的存儲方式:
類的大小包括非靜态資料成員而不包括成員函數。成員函數在類外單獨存放,并且同類的對象共用一份成員函數(節省了空間)。

但這時就引出了一個問題,由對象調用成員函數時,如何得知成員函數内所使用的資料成員屬于哪一個類呢?
這時就引入了this指針。
**一.this指針
:非靜态成員函數的第一個隐含形參,稱為this指針。**
①this指針的特性:
a.)this指針的類型:類類型 *const;
b.)this指針并不是對象的一部分,不會影響對象的大小;
c.)this指針是非靜态成員函數的第一個隐含指針形參,是編譯器自己處理的,我們不能在成員函數的形參中添加this指針的參數定義,也不能在調用時顯示傳遞對象的位址給this指針;
②this指針的兩種傳參方式:
1.)通過ecx寄存器傳參(寄存器相當于全局變量)—-當成員函數的參數固定時(這時遵循__thiscall調用約定);
2.)通過壓棧傳參—-當成員函數的參數為可變時(這時遵循__cdecl調用約定)。
驗證this指針的傳參方式:
this指針傳參時的彙編代碼如下:
拓展:__thiscall調用約定
a.thiscall調用約定隻能用于類的成員函數上;
b.參數從右向左依次壓棧;
c.參數個數确定,this指針通過ecx寄存器傳遞給被調用者;
參數個數不定,在所有參數壓棧以後,this指針再壓棧
d.參數個數不定,調用者清理堆棧,否則,函數本身清理堆棧。
③由this指針而引發的思考?
問題1:this指針和引用在底層實作相同,為什麼叫this指針,而不是引用?
因為最開始将c++稱為帶類的c,而引用是在c++1.0版才加入的,是以叫做this指針;
問題2:this指針有沒有可能為NULL?
有可能。(定義一個指向類對象的指針并使其初始化為NULL)