C++類成員訪問運算符(->)重載
類成員訪問運算符(- >)可以被重載,但它較為麻煩。它被定義為一個類類型的一個“類指針”行為。操作符 ->必須是一個成員函數。如果使用,它的返回類型必須為指針或一個類的對象,才可以適用。
在操作符 ->常用於與指針引用操作符*結合實施“智能指針”。這些指針是行為像正常指針除了它們執行其它任務時,通過它們訪問對象的對象,如自動對象刪除或者當指示器被破壞,或者指針用於指向另一個對象。
反引用操作符 ->可以被定義為一個一元後綴運算符。也就是說,給出一個類:
class Ptr{ //... X * operator->(); };
類的Ptr對象可以被用於訪問在一個非常類似的方式類X的成員的指針的使用方式。例如:
void f(Ptr p ) { p->m = 10 ; // (p.operator->())->m = 10 }
聲明p->m 被解釋為(p.operator->())->m。下麵的例子使用相同的概念,說明如何一個類接入運算符->可以被重載。
#include <iostream> #include <vector> using namespace std; // Consider an actual class. class Obj { static int i, j; public: void f() const { cout << i++ << endl; } void g() const { cout << j++ << endl; } }; // Static member definitions: int Obj::i = 10; int Obj::j = 12; // Implement a container for the above class class ObjContainer { vector<Obj*> a; public: void add(Obj* obj) { a.push_back(obj); // call vector's standard method. } friend class SmartYiibaier; }; // implement smart yiibaier to access member of Obj class. class SmartYiibaier { ObjContainer oc; int index; public: SmartYiibaier(ObjContainer& objc) { oc = objc; index = 0; } // Return value indicates end of list: bool operator++() // Prefix version { if(index >= oc.a.size()) return false; if(oc.a[++index] == 0) return false; return true; } bool operator++(int) // Postfix version { return operator++(); } // overload operator-> Obj* operator->() const { if(!oc.a[index]) { cout << "Zero value"; return (Obj*)0; } return oc.a[index]; } }; int main() { const int sz = 10; Obj o[sz]; ObjContainer oc; for(int i = 0; i < sz; i++) { oc.add(&o[i]); } SmartYiibaier sp(oc); // Create an iterator do { sp->f(); // smart yiibaier call sp->g(); } while(sp++); return 0; }
讓我們編譯和運行上麵的程序,這將產生以下結果:
10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21