標籤:

一個類有幾個this指針?如果只有一個,那是怎麼區分不同的對象呢?


說到底,this 它就是個關鍵字啊親……(所以它既不是類的成員,也不存在成員函數的隱式傳參……)

既然是關鍵字,它就是和 if、else、new、delete、extern、using 一個性質的東西,寫出來就有固定含義:

In the body of a non-static member function, the keyword this is a prvalue expression whose value is the address of the object for which the function is called.

(非靜態成員函數中,該關鍵字是一個 prvalue 表達式。哪個對象調用的該函數,這個表達式的值就是那個對象的地址。)


this 的語法上的含義相當於指向「本對象」的指針, this 後面通常跟的是 「-&>」。

所以 this 相當於對象的實例的地址。在構造對象的時候,先要分配對象實例的內存,所以編譯器可以拿到這個值。

當調用對象的成員函數時,編譯器採用了一個約定,通過 ECX 傳遞對象地址,稱之為 thiscall。調用對象的成員函數前,會把 ECX 賦值成對象的「地址」。(這裡說的對象地址並不一定是分配內存時那個起始地址,而是對象的視角邏輯地址。比如說,如果一個對象有多個父類時,調用不同父類的成員函數,對 ECX 的賦值將是不同的。)

當你的對象里有成員變數 x,你在代碼里寫 x,編譯器會把它翻譯成 「對象實例地址 + x 的偏移量」。

對對象來說,不同實例的地址當然是不同的,相對於不同對象的 this 當然值也不同。如同「我」這個詞,每個人都能使用「我」,但是相對於不同的人,指代的人也不同。

對象的地址總是在對象外部負責維持的。所以對象不需要持有自己的地址。(但對象需要持有自己的虛函數表,以通過對象地址實現多態。)


類只是一套產品設計方案,不是真實存在的實體。

比如汽車設計方案中說汽車可以調用「自己」的「跑」這個方法。那這裡的「自己」就是this,它當然不是指設計圖紙,指的是每一輛成品汽車。

而針對某一輛實體汽車來說,那『自己』當然指的就是它自己,而不是另一輛汽車。


一個類有一個this指針。但不同對象里this指針的值都不同。


this指針不是類成員,是函數的參數

當你調用obj.func()時,func函數會被傳入一個隱藏的參數,參數名是this,值是obj


類的實例調用成員方法時,實例取了自己的地址傳進了成員方法。

成員方法(靜態方法除外)本質上都有一個隱式參數,即this指針,類的每個實例在調用成員方法時都是取的每個實例自己的地址給的this,而成員方法在操作成員變數時,實際上都是變成了『this-&>成員變數』,所以成員方法操作成員變數時,都是操作每個實例自己的成員變數

垃圾渣三本所答,希望不要誤導了你


地球上有幾十億人類,每個人類都稱自己為「我」,請問,你會混淆「我」嗎?


打個比方。現在有一個student的類。用student實例化了三個人A,B,C,他們的學號分別是001 002 003。將生活中的活動看做是一些函數的調用。比如去吃飯就是eat(),睡覺就是sleep()函數。比如說A說要去吃飯,B說要睡覺。A調用eat()函數,B調用sleep()函數。說話的時候他們都沒說:我是A,我要吃飯,我是B我要睡覺。都沒有強調主體,但是你能很清楚的分開他們各自要做的動作。大概就是這個意思。


this指針指向當前對象。這個概念不好理解嗎?


只有一個。我們都知道,在一個類的成員函數中可以直接使用該類的成員變數,這是怎麼實現的呢?其實,在類的成員函數定義時,都會傳遞一個隱式參數 this ,這個 this 是一個常量指針,其值就是調用該成員函數的那個對象的地址。所以,同一個類的不同對象調用成員函數時,傳遞的 this 值也是不一樣的。


每個人都管自己叫「我」。

同樣的,每個類的實例都管自己叫this。

所以你說有幾個this呢?

另外,類和類的實例是不同的。至於靜態成員這種東西,你就當作是加強版的全局變數好了。


類沒有this指針,類的實例(對象)也沒有this指針。

例如: sizeof( class{ } )==1 //空類的長度1個位元組

sizefof( class{ double ele;} ) == 8 //只有一個雙精度數據成員的類的長度8個位元組。

你看看this指針在哪裡容身? 壓根沒地方。

那麼,大家說的this指針是什麼? 答案是:類的非靜態成員函數的一個(隱藏)參數。編譯器在編譯時把調用了非靜態成員函數的那個類實例的地址賦給這個隱藏的函數參數。

這跟你寫個 foo(int* param)這樣的函數沒啥區別


不同的人說"I am a object", 那麼主語" I "的含義取決於具體說話的那個人是誰.

假設人的概念為類, 那麼每個人就是一個具體的對象, 所以每個人(對象)都對應

不同的主語"I". 每個類實例化的對象的"this"和這個類似, this指代各個不同的對象.


對象將this指針實例化


你可以寫個函數,第一個參數叫this2之類的,調用函數的時候你把a對象當參數穿進來this2就指向a,把b對象當參數穿進來就指向b。這樣你就永遠不會暈指針了


一個人有一個爹。

每個人都有自己的爹。


抱歉,之前答案和評論誤導了,未經深思熟慮裝了個錯b。

@孫明琦 的答案是對的,this指針應當用隱式參數解釋。


反對 @叛逆者 的答案,類沒有 this 指針。

從C語言的角度來看,一個類是一個結構體,結構體里包含類的欄位和一個虛表指針,虛表包含了指向類中所有方法的指針。

創建實例就是為這個結構體在內存里 malloc 一塊內存的過程,malloc 返回的指針就是 this。


每個人都有一個本我


分清什麼是類,什麼是實例。


推薦閱讀:

C++中的struct?
如何快速入門UE4開發?
關於 《C++ Primer 5th》,使用了「 =default 」的默認構造函數相關問題?
內存池除了減少內存申請和釋放的開銷之外還有什麼提升性能或者方便之處?
為什麼c++不能把「= [] () ->」操作符重載為非成員函數?

TAG:C |