天天看點

類中非靜态成員函數中的----this指針

首先思考一下在c++中,編譯器是如何識别一個類的?

識别一個類可以分為一下三步?

①識别類名;

②識别資料成員;

③識别成員函數并将其改寫。

引出的問題:類中的資料成員相當于全局變量,但是全局變量在使用之前,必須先定義,而類中的資料成員的位置可以任意,這就是因為識别類時的順序而導緻的差別。

我們都知道類中成員函數和資料成員的存儲方式:

類的大小包括非靜态資料成員而不包括成員函數。成員函數在類外單獨存放,并且同類的對象共用一份成員函數(節省了空間)。

類中非靜态成員函數中的----this指針

但這時就引出了一個問題,由對象調用成員函數時,如何得知成員函數内所使用的資料成員屬于哪一個類呢?

這時就引入了this指針。

**一.this指針

:非靜态成員函數的第一個隐含形參,稱為this指針。**

①this指針的特性:

a.)this指針的類型:類類型 *const;

b.)this指針并不是對象的一部分,不會影響對象的大小;

c.)this指針是非靜态成員函數的第一個隐含指針形參,是編譯器自己處理的,我們不能在成員函數的形參中添加this指針的參數定義,也不能在調用時顯示傳遞對象的位址給this指針;

②this指針的兩種傳參方式:

1.)通過ecx寄存器傳參(寄存器相當于全局變量)—-當成員函數的參數固定時(這時遵循__thiscall調用約定);

2.)通過壓棧傳參—-當成員函數的參數為可變時(這時遵循__cdecl調用約定)。

類中非靜态成員函數中的----this指針

驗證this指針的傳參方式:

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)

類中非靜态成員函數中的----this指針