Para cada objeto declarado de una clase se mantiene una copia de sus datos, pero todos comparten la misma copia de las funciones de esa clase.
Esto ahorra memoria y hace que los programas ejecutables sean más compactos, pero plantea un problema.
Cada función de una clase puede hacer referencia a los datos de un objeto, modificarlos o leerlos, pero si sólo hay una copia de la función y varios objetos de esa clase, ¿cómo hace la función para referirse a un dato de un objeto en concreto?
La respuesta es: usando el puntero this. Cada objeto tiene asociado un puntero a si mismo que se puede usar para manejar sus miembros.
Volvamos al ejemplo de la clase pareja:
#include <iostream> using namespace std; class pareja { public: // Constructor pareja(int a2, int b2); // Funciones miembro de la clase "pareja" void Lee(int &a2, int &b2); void Guarda(int a2, int b2); private: // Datos miembro de la clase "pareja" int a, b; public: };
Para cada dato podemos referirnos de dos modos distintos, lo veremos con la función Guarda. Esta es la implementación que usamos en el capítulo 30, que es como normalmente nos referiremos a los miembros de las clases:
void pareja::Guarda(int a2, int b2) { a = a2; b = b2; }
Veamos ahora la manera equivalente usando el puntero this:
void pareja::Guarda(int a2, int b2) { this->a = a2; this->b = b2; }
Veamos otro ejemplo donde podemos aplicar el operador this. Se trata de la aplicación más frecuente, como veremos al implementar el constructor copia, o al sobrecargar ciertos operadores.
A veces necesitamos invocar a una función de una clase con una referencia a un objeto de la misma clase, pero las acciones a tomar serán diferentes dependiendo de si la referencia que pasamos se refiere al mismo objeto o a otro diferente, veamos cómo podemos usar el puntero this para determinar esto:
#include <iostream> using namespace std; class clase { public: clase() {} void EresTu(clase& c) { if(&c == this) cout << "Sí, soy yo." << endl; else cout << "No, no soy yo." << endl; } }; int main() { clase c1, c2; c1.EresTu(c2); c1.EresTu(c1); cin.get(); return 0; }
La función "EresTu" recibe una referencia a un objeto de la clase "clase". Para saber si se trata del mismo objeto, comparamos la dirección del objeto recibido con el valor de this, si son la misma, es que se trata del mismo objeto.
No, no soy yo. Sí, soy yo.
Normalmente no será necesario usar el puntero this en nuestros programas, pero nos resultará muy útil en el futuro, ya que existen situaciones en las que es necesario recurrir a este puntero.
this.
© Enero de 2001 Salvador Pozo, salvador@conclase.net