In C ++ sta usando
this->data
più lento di
data
Nella maggior parte dei casi, non ci sarà una differenza evidente (a meno che non si abbia il caso ovvio con i parametri del metodo nominati come le variabili membro). Ma attenzione ai modelli!
template <typename T> struct Base {
int i;
};
template <typename T> struct Derived : public Base<T> {
int get_i() { return i; }
};
Ciò causerà un errore di compilazione, a meno che non ci sia una variabile globale o in qualche modo accessibile denominata i
. Perché? Perché potrebbe esserci una successiva specializzazione di Base<T>
che non contiene una dichiarazione per i
. Per correggere l'errore (dicendo al compilatore che dovrebbe ritardare la ricerca di i
fino a quando Derived<T>
è istanziato), dovresti usare this->i
o Base<T>::i
(o portarlo in ambito con una dichiarazione using) .
Per ulteriori informazioni su questo argomento, cerca "ricerca del nome in due fasi".
Nessuna sorpresa. Sono funzionalmente identici.
Affinché il compilatore possa individuare il membro, il compilatore deve utilizzare il parametro this
nascosto. Pertanto non vi è alcuna differenza funzionale tra l'accesso a un membro con o senza l'utilizzo di this
.
Il motivo per utilizzare this
è di disambiguare altri nomi che potrebbero essere inclusi nell'ambito.
Se una classe ha una variabile membro chiamata data
e una delle sue funzioni membro (non statiche) ha anche una variabile locale (o parametro) chiamata data
, quindi data
è la variabile locale e this->data
è la variabile membro.
class Point
{
double x, y;
// ...
};
// Constructor with parameters named the same as the member vars
Point::Point(double x, double y)
{
this->x = x;
this->y = y;
}
In caso contrario, non c'è alcuna differenza: data
e this->data
si riferiscono alla stessa variabile membro. L'unico motivo per scrivere this->
è chiarire che intendi una variabile membro invece di una locale (e anche questo non è necessario se si adotta una convenzione come il prefisso delle variabili membro con m_
).
Leggi altre domande sui tag object-oriented c++