C++ 類成員訪問運(yùn)算符 -> 重載
類成員訪問運(yùn)算符( -> )可以被重載,但它較為麻煩。它被定義用于為一個(gè)類賦予"指針"行為。運(yùn)算符 -> 必須是一個(gè)成員函數(shù)。如果使用了 -> 運(yùn)算符,返回類型必須是指針或者是類的對(duì)象。
運(yùn)算符 -> 通常與指針引用運(yùn)算符 * 結(jié)合使用,用于實(shí)現(xiàn)"智能指針"的功能。這些指針是行為與正常指針相似的對(duì)象,唯一不同的是,當(dāng)您通過指針訪問對(duì)象時(shí),它們會(huì)執(zhí)行其他的任務(wù)。比如,當(dāng)指針銷毀時(shí),或者當(dāng)指針指向另一個(gè)對(duì)象時(shí),會(huì)自動(dòng)刪除對(duì)象。
間接引用運(yùn)算符 -> 可被定義為一個(gè)一元后綴運(yùn)算符。也就是說,給出一個(gè)類:
class Ptr{ //... X * operator->(); };
類 Ptr 的對(duì)象可用于訪問類 X 的成員,使用方式與指針的用法十分相似。例如:
void f(Ptr p ) { p->m = 10 ; // (p.operator->())->m = 10 }
語句 p->m 被解釋為 (p.operator->())->m。同樣地,下面的實(shí)例演示了如何重載類成員訪問運(yùn)算符 ->。
#include <iostream> #include <vector> using namespace std; // 假設(shè)一個(gè)實(shí)際的類 class Obj { static int i, j; public: void f() const { cout << i++ << endl; } void g() const { cout << j++ << endl; } }; // 靜態(tài)成員定義 int Obj::i = 10; int Obj::j = 12; // 為上面的類實(shí)現(xiàn)一個(gè)容器 class ObjContainer { vector<Obj*> a; public: void add(Obj* obj) { a.push_back(obj); // 調(diào)用向量的標(biāo)準(zhǔn)方法 } friend class SmartPointer; }; // 實(shí)現(xiàn)智能指針,用于訪問類 Obj 的成員 class SmartPointer { ObjContainer oc; int index; public: SmartPointer(ObjContainer& objc) { oc = objc; index = 0; } // 返回值表示列表結(jié)束 bool operator++() // 前綴版本 { if(index >= oc.a.size()) return false; if(oc.a[++index] == 0) return false; return true; } bool operator++(int) // 后綴版本 { return operator++(); } // 重載運(yùn)算符 -> 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]); } SmartPointer sp(oc); // 創(chuàng)建一個(gè)迭代器 do { sp->f(); // 智能指針調(diào)用 sp->g(); } while(sp++); return 0; }
當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:
10 12 11 13 12 14 13 15 14 16 15 17 16 18 17 19 18 20 19 21
更多建議: