Latest web development tutorials

C ++ Klasse Member-Access-Operator -> reload

C ++ Funktion Überlastung und Überladen von Operatoren C ++ Funktion Überlastung und Überladen von Operatoren

Klasse Member-Access-Operator (->) können überlastet werden, aber es ist umständlich. Es wird für eine bestimmte Klasse "Zeiger" Verhalten definiert. Operator -> muss eine Elementfunktion sein. Wenn Sie die Verwendung Operator -> muss der Rückgabetyp ein Zeiger oder eine Klasse von Objekten sein.

Operator -> ist in der Regel ein Zeiger Dereferenzierungsoperator * in Kombination mit, für "Smart Pointer" -Funktion zu erreichen. Diese Zeiger sind Zeiger wie normale Objekte verhalten, der einzige Unterschied ist, dass, wenn Sie einen Zeiger übergeben das Objekt zuzugreifen, sie haben andere Aufgaben. Wenn beispielsweise der Zeiger zerstört wird, oder wenn ein Zeiger auf ein anderes Objekt, wird das Objekt automatisch gelöscht.

Indirekte Referenz-Operator -> es kann als einstellige Postfix-Operator definiert werden. Das heißt, eine bestimmte Klasse:

class Ptr{
   //...
   X * operator->();
};

Ptr Klasse von Objekten verwendet werden , ein Member der Klasse X zuzugreifen,verwenden Sie die Zeiger Nutzung sehr ähnlich ist. Zum Beispiel:

void f(Ptr p )
{
   p->m = 10 ; // (p.operator->())->m = 10
}

Statement p-> m als (p.operator -> ()) - interpretiert> m. In ähnlicher Weise zeigt das folgende Beispiel, wie eine Klasse Member-Access-Operator neu zu laden ->.

#include <iostream>
#include <vector>
using namespace std;

// 假设一个实际的类
class Obj {
   static int i, j;
public:
   void f() const { cout << i++ << endl; }
   void g() const { cout << j++ << endl; }
};

// 静态成员定义
int Obj::i = 10;
int Obj::j = 12;

// 为上面的类实现一个容器
class ObjContainer {
   vector<Obj*> a;
public:
   void add(Obj* obj)
   { 
      a.push_back(obj);  // 调用向量的标准方法
   }
   friend class SmartPointer;
};

// 实现智能指针,用于访问类 Obj 的成员
class SmartPointer {
   ObjContainer oc;
   int index;
public:
   SmartPointer(ObjContainer& objc)
   { 
       oc = objc;
       index = 0;
   }
   // 返回值表示列表结束
   bool operator++() // 前缀版本
   { 
     if(index >= oc.a.size()) return false;
     if(oc.a[++index] == 0) return false;
     return true;
   }
   bool operator++(int) // 后缀版本
   { 
      return 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]);
   }
   SmartPointer sp(oc); // 创建一个迭代器
   do {
      sp->f(); // 智能指针调用
      sp->g();
   } while(sp++);
   return 0;
}

Wenn der obige Code kompiliert und ausgeführt wird, erzeugt es die folgenden Ergebnisse:

10
12
11
13
12
14
13
15
14
16
15
17
16
18
17
19
18
20
19
21

C ++ Funktion Überlastung und Überladen von Operatoren C ++ Funktion Überlastung und Überladen von Operatoren