我們在學習c++的時候,會了解到物件導向的思想以及類與物件。
簡單的來說,類是乙個設計圖紙:我們現實客觀世界的實體經過分析和抽象之後得到我們主觀世界裡的抽象類別,也就是你腦子裡的各種idea,當你把腦子裡的這種抽象類別設計出來之後,就得到了類(class),最後對class進行例項化得到我們的物件(object)。
整個過程可以用如下的圖來理解:
關於物件的模型,可以存在如下兩種方案:
毫無疑問,為了節省記憶體空間,我們肯定更傾向於方案二,也就是各個物件共用**區。
那麼,問題來了:
我們在呼叫同乙個類的不同物件的成員函式時,成員函式如何知道要訪問哪個物件的資料成員呢?
沒錯,上述問題的答案就是我們今天要講的this指標。
每個物件都擁有乙個this指標,this指標記錄物件的記憶體位址,當我們呼叫成員函式時,成員函式預設第乙個引數為t* const register this,大多數編譯器通過ecx暫存器傳遞this指標,通過 this 這個隱式引數可以訪問該物件的資料成員。
注:有關ecx暫存器其實就是c++的呼叫約定:_thiscall:_thiscall 是一種c++語言特有的呼叫方式,用於類成員函式的呼叫約定。
如果引數確定:
this指標存放於 ecx 暫存器,函式自身清理堆疊;
如果引數不確定:
this指標在所有的引數入棧後再入棧,呼叫者清理堆疊。
_thiscall 不是關鍵字,程式設計師不能使用。
#include
using
namespace std;
class
cgoods
float
gettotal()
};void cgoods::
registergoods
(const
char
* name,
int amount,
float price)
intmain()
可以看到我們建立了有關cgoods
類的兩個物件:tea
和book
;
那麼在執行tea.registergoods()
和book.registergoods()
的時候,我們怎麼知道該呼叫的是tea還是book呢?
這就不得不提編譯器對類進行編譯的步驟:
編譯器對程式設計師自己設計的類進行編譯時分為三步;其中最重要的就是最後一步改寫了:1、識別和記錄類體中屬性的名稱,型別和訪問限定;
2、識別和記錄類體中函式原型(返回型別+函式名+引數列表)、形參的預設值、訪問限定;
3、改寫在類中定義函式的引數列表和函式體,改寫物件呼叫成員函式的形式;
對我們上面的**改寫之後:
#include
using
namespace std;
class
cgoods
//float gettotal(cgoods* const this)
float
gettotal()
};//void cgoods::registergoods(cgoods* const this, const char* name, int amount, float price)
void cgoods::
registergoods
(const
char
* name,
int amount,
float price)
intmain()
可以看到,所謂的編譯器改寫:
即是在所有成員函式的引數列表新增了乙個t* const this
引數;
注:1、這個
t
是類的名稱,比如你定義的類名是cgoods
,那麼這裡的引數即為:cgoods* const this
;2、這個
const
不可缺少,它意味著this指標本身不可更改,也就是說,編譯器一旦改寫賦予了這個this指標,this指標繫結的物件就不可以改變。
keephopes.c++this指標詳解.cnblogs.2019.06.07c++中的this指標 | 菜鳥教程
C this指標理解
1.this指標的用處 乙個物件的this指標並不是物件本身的一部分,不會影響sizeof 物件 的結果。請細品以下概念 this作用域是在類內部,當在類的非靜態成員函式中訪問類的非靜態成員的時候,編譯器會自動將物件本身的位址作為乙個隱含引數傳遞給函式。也就是說,即使你沒有寫上this指標,編譯器在...
C this指標的理解
先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。雖然比int char這樣build in型別複雜的多,但首先要理解它們一樣是型別 用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變數x具有int型別一樣,變數my...
C this指標的理解
先要理解class的意思。class應該理解為一種型別,象int,char一樣,是使用者自定義的型別。雖然比int char這樣build in型別複雜的多,但首先要理解它們一樣是型別 用這個型別可以來宣告乙個變數,比如int x,myclass my等等。這樣就像變數x具有int型別一樣,變數my...