位置:首页 > 高级语言 > C++在线教程 > C++类成员访问运算符(->)重载

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