Ist es wichtig, ob dies in einem C ++ - Setter verwendet wird?

8

Angenommen, ich habe eine C ++ - Klasse mit einer privaten Variablen, x. Gibt es einen Unterschied bei der Verwendung von this ? Gibt es das Potenzial für unerwünschtes / unerwartetes Verhalten, wenn ich this nicht verwende?

Setter:

%Vor%

Setzer mit this :

%Vor%     
Elpezmuerto 26.09.2011, 15:54
quelle

7 Antworten

4

Wegen der zweiphasigen Suche nach Klassenvorlagen ist möglicherweise this für

erforderlich
  1. gibt explizit an, dass Sie ein Mitglied meinen
  2. wegen der Nachschlage-Regeln könnte der Compiler eine andere Entität annehmen, die dort sichtbar ist

(siehe erstes Beispiel) Beide sind gleichwertig.

In einer Nicht-Template-Situation vermeiden Sie normalerweise die Verwendung von this ; Der generierte Code ist derselbe, daher gibt es keinen Unterschied (siehe das zweite Beispiel) . Der Grund dafür ist, dass der Compiler versucht, jedes Symbol, das er sieht, zu suchen. Der erste zu suchende Ort befindet sich im Klassenbereich (mit Ausnahme des Block- und Funktionsumfangs). Wenn dort ein Symbol dieses Namens gefunden wird, wird implizit this ausgegeben. In Wirklichkeit sind Elementfunktionen nur gewöhnliche Funktionen mit einem unsichtbaren Parameter.

%Vor%

Wird tatsächlich in

umgewandelt %Vor%

vom Compiler.

Verhaltensbeispiel für this in Vorlagen:

%Vor%

Ausgabe:

%Vor%

Beispiel Assembly für Nicht-Vorlage:

Mit this :

%Vor%

Ohne this :

%Vor%

Bestätigen Sie sich selbst:

test.cc:

%Vor%

Führen Sie g++ -S test.cc aus. Sie sehen eine Datei namens test.s , in der Sie nach den Funktionsnamen suchen können.

    
Sebastian Mach 26.09.2011, 16:04
quelle
5

Diese beiden Codefragmente (vorausgesetzt, sie sind Inline-Memberfunktionen, da es kein ClassName:: -Bit gibt) sind genau gleichwertig. Verwenden Sie, was Sie bevorzugen. Ich würde eher empfehlen, Parameter wie die Member-Variablen zu benennen; es ist zu einfach, sie durcheinander zu bringen.

    
bdonlan 26.09.2011 15:57
quelle
2

Diese Variante macht einen syntaktischen Unterschied, wenn es um Templates geht. Es ist jedoch semantisch dasselbe; Die this-> - Variante macht es nur einfacher, auf die aktuellen Objekte zuzugreifen und mögliche Kollisionen zu vermeiden.

    
thiton 26.09.2011 15:57
quelle
2
%Vor%

Wenn die Membervariable x durch das Argument x verdeckt würde, dann wird this-> explizit benötigt, um sicherzustellen, dass Sie der richtigen Variablen zuweisen. Sonst wird es nicht benötigt.

Aber ich empfehle nicht, dass Sie Ihrem Argument das gleiche wie eine Membervariable geben. Das erste Beispiel, das Sie geben, hat weniger Fallstricke.

    
James 26.09.2011 15:58
quelle
1

Es gibt keinen Unterschied zwischen ihnen.

    
Nawaz 26.09.2011 15:57
quelle
1

Obwohl Ihr Code funktioniert, ist es schlechter Code und wahrscheinlich jemanden zu verwirren.

Viel besser, um dem Parameter "setX ()" einen anderen Namen zu geben.

z.B.

%Vor%     
Michael J 26.09.2011 17:16
quelle
0

Macht nichts. Ich habe mit Code-Konventionen gearbeitet, die besagen, dass auf alle privaten Variablen über this zugegriffen werden sollte, um den Code lesbarer zu machen. Aber abgesehen von der Lesbarkeit denke ich nicht, dass es einen Unterschied gibt.

    
long404 26.09.2011 15:57
quelle

Tags und Links