operator-> 是 C++ 唯一必須定義為成員函數、且不接受顯式參數的運算符。其右操作數是「成員名稱識別符」,而非表達式,編譯器負責解析成員存取。
對 obj->member,編譯器依序嘗試:
obj 是指標,直接解引用存取成員。obj 是定義了 operator->() 的類別物件,轉為 obj.operator->()->member,並遞迴套用上述三階段。結論:operator->() 必須回傳「指向類別的指標」或「定義了 operator-> 的類別物件」,最終必須收斂到指標的內建箭頭操作。
class A { public: void action() { cout << "Action in A\n"; } };
class B {
A a;
public:
A* operator->() { return &a; } // 回傳指標 → 終結遞迴
void action() { cout << "Action in B\n"; }
};
class C {
B b;
public:
B operator->() { return b; } // 回傳物件 → 繼續遞迴
void action() { cout << "Action in C\n"; }
};
int main() {
C* pc = new C;
pc->action(); // 輸出:Action in C (內建指標語義)
C c;
c->action(); // 輸出:Action in A (遞迴鏈:C::operator->() → B::operator->() → A::action())
}
c->action() │ ├─ c.operator->() 回傳 B 物件 b │ │ │ ├─ b.operator->() 回傳 A* 指標 &a │ │ │ │ │ └─ 內建 -> 解引用指標,呼叫 A::action() │ │ │ └─ (若 B::operator-> 回傳物件,繼續遞迴) │ └─ 完成
operator-> 回傳底層指標,實現透明委派(如 std::unique_ptr)。operator-> 的物件,建立多層攔截/記錄/檢查鏈。operator-> 的類型 → 編譯錯誤。const 版本:需提供 T* operator->() const 支援 const 物件。operator* 混淆:*ptr 對應 operator*,ptr->mem 對應 operator->。operator-> 的遞迴特性是 C++ 獨特的設計,支援智慧指標、Proxy、鏈式委派等進階模式。掌握其「必須最終收斂到指標」的核心規則,即可靈活運用於資源管理與介面設計。