2009-10-22 9 views
6

die Frage ist einfach ... gibt es einen Unterschied in der Verwendung this-> yourvariable oder yourvariable direkt aus irgendeinem Grund?der "dieser" Zeiger in einer Klasse

Ich finde kein Problem damit, aber ich benutze dies-> viel und würde gerne wissen, ob es einen Unterschied gibt, bevor es weiter geht.

Ich sah einen Kommentar zu einem Beitrag hier und ich erinnere mich nicht an welchen Thread, aber die Person sagte etwas über die Verwendung des Schlüsselwortes "this".

Persönlich finde ich es schön, als die Variable direkt zu verwenden. Es macht den Code einfacher und schöner.

Joe

+2

siehe: http://stackoverflow.com/questions/993352/when-should-i-make-explicit-use-of-the-this-pointer –

+0

Die meisten Kodierungsrichtlinien, die ich gelesen habe, missbilligen dies ohne guten Grund . Es ist Code-Rauschen, das keine Bedeutung hinzufügt. Jeder, der Ihren Code liest, sollte aus dem Kontext schließen können, dass Sie ein Klassenmitglied verwenden. – dss539

+0

Die Verwendung von 'this' macht das Programm explizit lesbarer – Xinus

Antwort

12

Nein, es gibt keinen wirklichen Unterschied, es ist einfach ein Bereichsqualifizierer. Angenommen, eine Methode

void SetFoo(Foo foo) 
{ 
    this->foo = foo; 
} 

wo dies ist ein privates Mitglied. Hier können Sie einen Parameter mit demselben Namen wie eine Klassen-/Instanzvariable verwenden.

0

Dies wurde irgendwie gefragt und beantwortet über C# here und ich denke, dass die Antwort (zumindest meine) die gleiche ist. Es ist Präferenz.

1

Ich finde, dass mit this meinen Code lesbarer macht, aber es gibt keinen Grund, dass Sie müssen. Wenn Sie sich den Assembler-Code anschauen, den Ihr Compiler erzeugt, sollte er funktional (und normalerweise wörtlich) identisch sein.

Grundsätzlich, wenn die Funktion aufgerufen wird, wird ein verstecktes Argument this übergeben, das dann verwendet wird, um herauszufinden, welche Variablen wo sind. Wenn Sie die Variablen direkt verwenden, ohne this->, tun Sie nichts, außer etwas syntaktischen Zucker zu verwenden.

16

In den meisten Fällen gibt es keinen Unterschied. Aber es gibt Situationen, in denen es einen Unterschied macht:

class foo 
{ 
    int i; 
    void bar() { 
     int i = 3; 
     i; // refers to local i 
     this->i; // refers to the member i 
    } 
}; 

Auch mit Vorlagen Sie benötigen ein Mitglied mit this-> zu qualifizieren, so dass Namenssuche verzögert:

template<typename T> 
struct A 
{ 
    int i; 
    T* p; 
}; 

template<typename T> 
struct B : A<T> 
{ 
    void foo() { 
     int k = this->i; // here this-> is required 
    } 
}; 

Ein Compiler, der ordnungsgemäß funktioniert die "Zweiphasen-Suche" wird sich beschweren, falls Sie "this->" entfernen, dass es nicht weiß, was ich sein soll. "this->" sagt, dass es ein Mitglied einer Basisklasse ist. Da die Basisklasse von einem Vorlagenparameter abhängt, wird die Suche verzögert, bis die Klassenvorlage instanziiert wird.

+0

+1 für die Signalisierung des Template-Problems. gcc sagt normalerweise etwas in der Zeile ' hängt nicht von einem Template-Parameter, so dass eine Definition verfügbar sein muss'. –

Verwandte Themen