Ci sono tre casi mi viene in mente:
Quando si vuole semplicemente passare un puntatore alla classe corrente:
class B;
struct A {
B* parent_;
A(B* parent) : parent_(parent) {}
};
struct B {
A* a;
B() : a(new A(this)) {}
};
In una funzione di costruzione o di un membro, in cui un membro è ombreggiato da un argomento:
struct A {
int a;
void set_a(int a) { this->a = a; }
};
Qui, la variabile membro "a" è ombreggiata dall'argum ent "a", quindi this->
viene utilizzato per accedere al membro anziché all'argomento.
(nell'esempio sopra modificati per essere una funzione piuttosto che di costruzione, dal momento che normalmente non assegnare questo modo in un costruttore)
Quando si accede una variabile pubblica/protetta membro o funzione in una classe di base di una classe template
template <class T>
struct A {
int a;
};
template <class T>
struct B : public A<T> {
int f() { return this->a; }
}
qui, a
da solo non sarebbe un nome di dipendente, in modo che il compilatore si aspetterebbe di trovare una dichiarazione di esso in B
o una base di B
che non dipende su T
. L'aggiunta di this->
rende la ricerca dipendente dal tipo di this
e poiché this
è un tipo dipendente, la ricerca di a
viene posticipata fino all'istanziazione di f()
.
Uno potrebbe scrivere return A::a
anziché return this->a
, ma in presenza di più basi, sia dirette che indirette, utilizzando this->
è più flessibile. Questa sintassi alternativa è anche limitata alle variabili membro e alle funzioni non virtuali: se viene utilizzata con una funzione virtuale, la funzione verrà richiamata direttamente anziché effettuare una chiamata di funzione virtuale.
per C++ tua ultima considerazione è vero, ma per Java o C#, non è sempre la convenzione – Geoffroy
Questo è il motivo per cui è il nome sempre il vostro membro variabili in modo diverso da quelle locali, ad es 'm_myVar' o' myVar_' e così via. Poiché l'utilizzo di 'this' non è applicato, la maggior parte dei progetti sceglie di forzare uno standard di denominazione sulle variabili membro. –
Non direi che è una buona forma usare "questo" tutto il tempo. Usalo solo se ci sono nomi in ombra. Di solito si possono evitare anche le ombre. –