2012-03-06 5 views
12

All'interno di una funzione membro di una classe in C++, fa la differenza, se utilizzo this->dataMember o solo dataMember? Cosa è considerato migliore stile? C'è qualche differenza di prestazioni?Dovrei usare `this` all'interno di una classe?

(io non sto parlando del caso in cui una variabile locale ha lo stesso nome del membro di dati, nel qual caso è necessario, a mia conoscenza, utilizzare this-> di distinguere tra loro.)

risposta

4

è semplicemente superfluo utilizzare this-> per chiamare membri, a meno che non si desideri distinguere semanticamente tra residenti e membri rapidamente. molte persone usano il prefisso m_ per i membri della classe, per evitare di scrivere this-> tutto il tempo.

1

uso questo quando si dispone di un membro di nascosto/privato =) in ogni altro caso non fare la differenza =)

dal centro informazioni di IBM cito il seguente

Unless a class member name is hidden, using the class member name is equivalent to using 
the class member name with the this pointer and the class member access operator (->). 
1

utilizzando " questo-> "è migliore (sei sicuro che siano i membri) ma non fa la differenza

0

Se una funzione modello effettua una chiamata a una funzione membro in modo tale che la chiamata non dipenda da alcun parametro di modello, this-> può essere usato per aiutare il compilatore in alternativa a MyUtopicClass<int, double, double>::vin().

+2

Attenzione: se 'vin' è una funzione virtuale, quindi' this-> vin() 'e' MyUtopicClass :: vin() 'sono diversi. – aschepler

6

Questa è una questione di stile. Ad alcune persone piace il this-> in più per rendere più evidente l'accesso a un membro della classe. Ma se ritieni che sia abbastanza ovvio senza di esso, non ci sarà alcuna differenza nel codice generato o nelle prestazioni.

(Oltre al caso lei ha citato con gli ambiti sovrapposti, this-> può anche essere obbligatorio in un modello quando si cerca di nominare un membro di una classe di base a seconda del tipo.)

19

Come regola generale, si tratta di una questione di convenzioni locali. La maggior parte dei posti che ho visto non usano this-> tranne quando necessario, ed è lo la convenzione che preferisco, ma ho sentito parlare di persone che preferiscono usare lo in modo sistematico.

Ci sono due casi quando è necessario. Il primo è se hai nascosto il nome con lo stesso nome in ambito locale; se ad es. si dispone di un membro denominato toto e si chiama anche l'argomento della funzione toto. Molte convenzioni di codifica contrassegnano il membro o gli argomenti per evitare questo caso , ad es. tutti i nomi dei membri iniziano con my o m_ oppure il nome di parametro inizia con the.

L'altro caso è che this-> può essere utilizzato in un modello per rendere dipendente il nome . Ciò è rilevante se una classe template eredita da un tipo dipendente e si desidera accedere a un membro della base, ad es.:

template <typename T> 
class Toto : public T 
{ 
public: 
    int f() 
    { 
     return this->g(); 
    } 
}; 

Senza la this-> qui, g() sarebbe un nome non-dipendente, e il compilatore sarebbe cercarlo nel contesto della definizione del modello, senza prendere la classe di base in considerazione.

+0

Questa è un'ottima risposta, non avevo considerato il caso modello. – MadPumpkin

5

Io uso sempre this quando si chiama membro funzioni.

  1. Trasforma il nome della funzione in un nome dipendente in modo che le funzioni dei membri della classe base vengano trovate all'interno di un modello di classe.
  2. Sopprime la ricerca dipendente dall'argomento. ADL ha i suoi vantaggi, ma può portare a comportamenti sorprendenti, e mi piace se non mi sta ostacolando.
  3. Non presenta svantaggi reali e pertanto lo utilizzo per tutte le chiamate di funzioni membro per motivi di coerenza.
  4. I programma in Python molto in cui un esplicito self è obbligatorio, quindi non è un vero peso per me.

Ma per i membri dei dati lo utilizzo solo quando necessario perché non è in corso alcuna ADL. Per rispondere alle vostre domande specifiche:

All'interno di una funzione membro di una classe in C++, fa la differenza, se uso questo-> dataMember o solo dataMember?

Sì, se questo è all'interno di un modello di classe. Quindi dataMember è considerato un nome non dipendente, che può portare a differenze semantiche. Per esempio:

#include <iostream> 

int i = 1; 

struct R { 
    int i; 
    R(): i(2) { } 
}; 

template<typename T> 
struct S: T { 
    void f() { 
    std::cout << i << ' '  // selects ::i 
       << this->i  // selects R::i 
       << std::endl; 
    } 
}; 

int main() { 
    S<R>().f(); 
} 

Quello che è considerato lo stile migliore?

Non credo che ci sia una forte opinione all'interno della comunità su questo. Usa uno stile, ma sii coerente.

C'è qualche differenza di prestazioni?

Sono quasi sicuro che non ci sia.