作者透過 6 個層層遞進的問題,從「this 是什麼」深入到「實現機制」,最終揭示 this 既存在又不存在 的辯證本質。
非靜態成員函數的隱含參數,指向調用該函數的物件實例。
英文「this」意指「這個」,暗示僅在類別內部可見,代表「這個類別的這個物件」。
成員變數/函數存取實際上均為 this->member。編譯器自動插入 this,程式碼可寫可不寫。
有。this 本質是指標 (機器碼層面為暫存器/棧上值),儲存物件位址。
new 出的物件:this 值在堆區 (物件位址)。this 值在棧區 (物件位址)。類別內部所有非靜態成員存取。範例:
class A {
int v;
void f() { this->v = 1; } // 等價 v = 1;
};
核心揭秘:編譯器將 this 作為第一個隱含參數傳遞給成員函數 (通常放 ECX (MSVC thiscall) 或 RDI (System V AMD64) 暫存器)。
// 原始碼
class Test { int a; void foo() { a = 1; } };
Test t; t.foo();
// 反組譯關鍵段
01351041 mov ebp, esp ; 建立堆疊幀
01351047 mov eax, [ebp-4] ; 取得 this (物件位址 ebp-4)
0135104A mov dword ptr [eax], 1 ; this->a = 1
ebp-4 為物件在棧上位址 (即 this 值)。eax 載入該位址,隨後解引用存取成員。| 視角 | 結論 | 理由 |
|---|---|---|
| 源碼/語言語義 | 存在 | C++ 標準定義非靜態成員函數有隱含 this 參數,可在程式碼中顯式使用 this->。 |
| 機器碼/執行時 | 不存在 | 無 this 符號、無額外記憶體儲存 this,只有暫存器/棧上傳遞的物件位址。 |
| 實現本質 | 位址傳遞約定 | 編譯器約定:調用者將物件位址置於特定暫存器/棧位,被調用者以此定址成員。 |
sizeof(Test) == 4 不含 this)。&this 錯誤),不可修改。const 成員函數 (this 變為 const Test* const)。this 傳遞給其他執行緒/回調 (物件未完全建構)。static_cast(this) 實現靜態多態。