Para cada objeto declarado de una clase se mantiene una copia de sus campos, pero todos comparten la misma copia de los métodos de la clase.
Cada método de una clase puede hacer referencia a los campos de un objeto, modificarlos o leerlos, pero si sólo hay una copia del método y varios objetos de esa clase, ¿cómo hace el método para referirse a un dato de un objeto en concreto?
La respuesta es: usando el puntero especial llamado this.
Se trata de un puntero que tiene asociado cada objeto y que apunta a si mismo. Ese puntero se usa para acceder a sus miembros.
El puntero this nos permite acceder a los campos del objeto que llama al método.
EJEMPLO EN C++:
En este ejemplo se ilustra una forma de saber si el objeto que se pasa como parámetro es el mismo que el que hace la llamada (comprueba si ambos apuntan al mismo sitio).
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); }OTRO EJEMPLO EN C++: Tenemos la siguiente clase pareja.
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; };Con la clase Guarda, asignamos los enteros que le pasamos al método como parámetros a los campos del objeto que ha hecho la llamada. La forma más sencilla de hacer esto sería así:
void pareja::Guarda(int a2, int b2) { a = a2; b = b2; }Pero para ver el funcionamiento del this, tambien lo podriamos hacer así:
void pareja::Guarda(int a2, int b2) { this->a = a2; this->b = b2; }En .NET el uso es el mismo pero cambiando el this-> por this. EJEMPLO EN .NET:
public class Person { string firstName; string lastName; DateTime birthDate; public Persona(string firstName, string lastName, DateTime birthDate) { this.firstName = firstName; this.lastName = lastName; this.birthDate = birthDate; } }
Vete a tomar por culo