this
指針不是對象或類的成員 - 它是您調用的方法的隱式參數。因此,它的傳遞方式與其他參數非常相似 - 除非您不直接詢問它。
在上例中,構造函數是一種特殊的方法,它又是一種特殊的函數。當你構造對象,編譯器分配它的內存(在這種情況下,在棧上,如a
在main
函數的局部變量。然後,它會自動調用構造函數初始化對象。
作爲調用的一部分構造函數,隱參數this
- 一個指向你的對象 - 傳遞作爲參數
在具有以下簽名的方法...
void MyMethod (const int* p) const;
其實有兩個參數,兩個指針。 。有顯式參數p
和隱式參數this
。該行末尾的const
指定this
是一個常量指針,與前面的指定p
是一個常量指針一樣。因爲this
是隱式傳遞的,所以只能存在對這種特殊語法的需求,所以不能像其他參數那樣以常規方式指定常量。
「靜態」方法沒有隱含的「this」參數,並且無法直接訪問對象成員 - 可能沒有與該調用關聯的特定對象。它基本上是一個標準函數,而不是一個方法,除了訪問私有成員(提供它可以找到一個要訪問的對象)。
正如Steve Fallows指出的那樣,sizeof (this)
在編譯時是已知的,因爲它是一個指針類型,所有指針(* 1)具有相同的sizeof
值。你看到的「8」意味着你正在編譯一個64位平臺。this
此時可用 - 它指向有效內存,並且所有成員都已完成其構造函數調用。但是,它不一定是完全初始化的 - 畢竟你仍然在構造函數中。
編輯
* 1 - 嚴格,這可能不是真的 - 但是編譯器知道它在這裏處理什麼類型的指針與即使該值直到運行時才知道。
編譯器知道* this的大小,它會生成一個硬編碼的值。也許你需要一個更好的例子。 – 2010-03-20 15:57:34
sizeof是編譯時的東西(我不會說硬編碼),並且不依賴於運行時「this」指針中包含的值。另外,vtable(應該有一個)不是「在構造函數中」構造的。 Neil: – 2010-03-20 16:02:33
:真的嗎?如果不是int構造函數,那是什麼? – skydoor 2010-03-20 16:12:25