this – słowo kluczowe odnoszące się w niestatycznych metodach klasy do obiektu na rzecz którego dana metoda została wywołana.
W Smalltalku zamiast this używane jest słowo kluczowe self.
Zależnie od użytego języka, this jest interpretowane jako:
Użycie this
Sytuacje w których użycie this jest niezbędne:
- Zwrócenie referencji danego obiektu z metody lub przekazanie jako parametr do innej funkcji/metody np. (przykład w C++):
class Wektor { public: Wektor& operator = ( const Wektor& wzorzec ) { x = wzorzec.x; y = wzorzec.y; return *this; // zwrócenie referencji } private: double x; double y; /* ... */ }
- W celu odróżnienia nazw zmiennych w klasie i nazw parametrów formalnych metody w przypadku gdy są takie same np. (przykład w Javie):
class Wektor { private double x; private double y; public Wektor( double x , double y ) { this.x = x; // rozróżnienie parametrów formalnych konstruktora od zmiennych w klasie this.y = y; } /* ... */ }
- Wywołanie innego konstruktora z ciała konstruktora tej samej klasy (Java).
class Person { private String name; private Date dateOfBirth; public Person( String name ) { this( name , new Date() ); // Wywołanie innego konstruktora w klasie. } public Person( String name , Date dateOfBirth ) { this.name = name; this.dateOfBirth = dateOfBirth; } /* ... */ }
Podczas tworzenia obiektu przy użyciu jednoargumentowego (np.: new Person( "Jan Kowalski" )
) konstruktora spowoduje wywołanie z jego wnętrza konstruktora dwuargumentowego w którym to pola w klasie są docelowo ustawiane.
this a konwencja nazewnicza
Jednym z popularnych sposobów wyróżnienia pola w klasie od zmiennej lokalnej w metodzie jest użycie przedrostka "m_" w nazwie zmiennej np: m_date
, m_name
. Przedrostek ten pochodzi od angielskiego member czyli członek (w tym wypadku członek klasy). Technika ta wymusza aby każde pole w klasie rozpoczynało się od "m_" co w zależności od środowiska pracy może być uciążliwe np. podczas sortowania po nazwie. Alternatywą dla tego sposobu oznaczania członków klasy jest użycie this - nawet wtedy, gdy nie jest to konieczne. Pozwala to posiadać nazwy zmiennych zgodne z zamierzeniami np.: date
czy name
a ich użycie w kodzie będzie wyglądało odpowiednio: this.date
i this.name
.
Samobójstwo obiektu
W C++ this jest interpretowany jako wskaźnik. Z tego powodu możliwa jest konstrukcja, w której obiekt popełnia samobójstwo. Realizuje się to poprzez wywołanie delete this;
w ciele metody obiektu:
class Samobojca { private int dana; public void zabijSie() { dana = 1; // ok delete this; // dana = 2; // błąd, obiekt juz nie istnieje } }
Aby mechanizm samobójstwa zadziałał bez błędów obiekt musi być stworzony na stercie, czyli inaczej mówiąc przy użyciu operatora new
. Należy również pamiętać, że od momentu wykonania delete this;
, obiekt przestaje istnieć i wszelkie odwołania do pól obiektu spowodują naruszenie ochrony pamięci.
Z praktycznego punktu widzenia samobójstwo obiektu jest stosunkowo rzadko spotykane a używanie tego mechanizmu świadczy o błędzie w koncepcji programu.