Latest web development tutorials

C ++ operador de acceso miembro de la clase -> recarga

C ++ sobrecarga de funciones y la sobrecarga de operadores C ++ sobrecarga de funciones y la sobrecarga de operadores

operador de acceso miembro de la clase (->) se puede sobrecargar, pero es engorroso. Se define para una clase de comportamiento "puntero" dado. Operador -> debe ser una función miembro. Si se utiliza el operador ->, el tipo de retorno debe ser un puntero o una clase de objetos.

Operador -> suele ser un operador de referencia a un puntero * se utiliza en combinación con, por lograr la función de "puntero inteligente". Estos punteros son punteros se comportan como objetos normales, la única diferencia es que cuando pasa un puntero para acceder al objeto, que llevan a cabo otras tareas. Por ejemplo, cuando el puntero se destruye, o cuando un puntero a otro objeto, el objeto se eliminará automáticamente.

operador de referencia indirecta -> se puede definir como un operador de sufijo unario. Es decir, una clase dada:

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

clasePtr de objetos se puede utilizar para acceder a un miembro de la clase X,utilice el uso puntero es muy similar. Por ejemplo:

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

Declaración p-> m se interpreta como (p.operator -> ()) -> m. Del mismo modo, el siguiente ejemplo muestra cómo volver a un operador de acceso a miembro de la clase ->.

#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;
}

Cuando el código se compila y ejecuta, produce los siguientes resultados:

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

C ++ sobrecarga de funciones y la sobrecarga de operadores C ++ sobrecarga de funciones y la sobrecarga de operadores