初學 C++ 時,this 指標往往是令初學者感到困惑的概念之一。許多人一開始根本不知道它是什麼、有什麼作用;等到真正理解後,才發現它其實是連接「對象」與「成員函數」的關鍵橋樑。本文將透過實例程式碼與記憶體模型圖解,帶您徹底掌握 this 指標的本質與應用場景。
this 指標本質上是一個指向當前對象的指標。在 C++ 中,類的定義本身不佔用記憶體空間(成員函數存放在代碼區),只有當定義該類類型的對象時,系統才會在堆或棧上為其分配存儲空間,該空間僅存放成員變數。
我們以一個簡單的日期類為例,觀察 this 在幕後如何運作:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
using namespace std;
class Date {
public:
void setYear(int year) { m_year = year; }
void setMonth(int month) { m_month = month; }
void setDay(int day) { m_day = day; }
void print() { cout << m_year << "-" << m_month << "-" << m_day << endl; }
private:
int m_year;
int m_month;
int m_day;
};
int main() {
Date date;
date.setYear(2016);
date.setMonth(7);
date.setDay(4);
date.print();
system("pause");
return 0;
}
當呼叫 date.setYear(2016) 時,編譯器隱式地將 &date 作為第一個參數傳遞給成員函數,函數簽名實際上等價於:
void setYear(Date* const this, int year);

圖中清晰展示了對象 date 的首地址如何透過 this 指標傳遞給成員函數,從而讓函數能正確訪問該對象的成員變數。
雖然大多數情況下 this 可省略,但參數與成員變數重名時,必須顯式使用 this-> 來消除歧義:
void setYear(int m_year) { // 參數名與成員變數同名
this->m_year = m_year; // 必須寫 this-> 指明是成員變數
}
這也是為何許多編碼規範建議成員變數加前綴(如 m_),以避免此類衝突。
this 是編譯器隱式傳遞的「當前對象地址」。this-> 是消除歧義的唯一方式。掌握 this 指標,是理解 C++ 物件模型、進階特性(如鏈式呼叫、移動語義)的基石。越努力,越幸運!