C++ Sobrecarga del operador de acceso a miembros de clase ->

C++ 重载运算符和重载函数Sobrecarga de operadores y funciones en C++

El operador de acceso a miembros de clase (->) puede sobrecargarse, pero es bastante complicado. Está definido para otorgar a una clase un comportamiento de "puntero". El operador -> debe ser una función miembro. Si se utiliza el operador ->, el tipo de retorno debe ser un puntero o un objeto de la clase.

El operador -> generalmente se combina con el operador de desreferencia de punteros * para implementar la funcionalidad de los "punteros inteligentes". Estos punteros son objetos cuyo comportamiento es similar al de los punteros normales, con la única diferencia de que ejecutan otras tareas cuando se accede a un objeto a través del puntero. Por ejemplo, cuando el puntero se destruye, o cuando el puntero apunta a otro objeto, el objeto se elimina automáticamente.

El operador de desreferencia -> puede definirse como un operador unario sufijo. Es decir, dada una clase:

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

ClasePtrEl objeto de... puede usarse para acceder a la claseXde los miembros, con un uso muy similar al de los punteros. Por ejemplo:

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

La sentencia p->m se interpreta como (p.operator->())->m. De manera similar, el siguiente ejemplo demuestra cómo sobrecargar el operador de acceso a miembros de clase ->.

Ejemplos

#include <iostream> #include <vector> using namespace std; // Supongamos una clase real class Obj { static int i, j; public: void f() const { cout << i++ << endl; } void g() const { cout << j++ << endl; } }; // Definición de miembro estático int Obj::i = 10; int Obj::j = 12; // Implementar un contenedor para la clase anterior class ObjContainer { vector<Obj*> a; public: void add(Obj* obj) { a.push_back(obj); // Llamar al método estándar del vector } friend class SmartPointer; }; // Implementar un puntero inteligente para acceder a los miembros de la clase Obj class SmartPointer { ObjContainer oc; int index; public: SmartPointer(ObjContainer& objc) { oc = objc; index = 0; } // El valor de retorno indica el final de la lista bool operator++() // Versión prefija { if(index >= oc.a.size() - 1) return false; if(oc.a[++index] == 0) return false; return true; } bool operator++(int) // Versión sufija { return operator++(); } // Sobrecargar el operador -> 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); // Crear un iterador do { sp->f(); // Llamada al puntero inteligente sp->g(); } while(sp++); return 0; }

Cuando el código anterior 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 operadores y funciones en C++

Otras extensiones