Frage nach "diesem" Zeiger in C ++

8

Ich habe eine Klasse mit int-Variablen x und y in private und eine Operator-Überlastfunktion erhalten,

%Vor%

Was bewirkt "Bag-Ergebnis (* this)"? Dort?.

    
silent 28.03.2010, 06:35
quelle

5 Antworten

10

Bag result(*this) erstellt eine Kopie des Objekts, auf dem die Operatorfunktion aufgerufen wurde.

Beispiel wenn es war:

%Vor%

dann wird result eine Kopie von op1 sein.

Da die Funktion operator+ eine Summe ihrer Operanden macht und die Summe zurückgibt, brauchen wir einen Weg, um auf den Operanden op1 zuzugreifen, der über den this -Zeiger erfolgt.

Alternativ hätten wir Folgendes tun können:

%Vor%     
codaddict 28.03.2010, 06:38
quelle
5

Ihr Code würde folgendermaßen aussehen:

%Vor%

Auf das implizite "aktuelle Objekt" für Elementfunktionen wird ein spezieller Wert mit dem Namen this gezeigt. Dann ruft *this dieses Objekt ab (durch Dereferenzierung von this ), und es wird verwendet, um (über den Kopierkonstruktor) eine andere Tasche namens result zu konstruieren.

Ich vermute, dass dieser Code aus einer Hausaufgabe stammt, also könnten Sie ein echtes Additionsoperator Muster, aber es ist üblich und Sie sollten sich dessen bewusst sein:

%Vor%     
Roger Pate 28.03.2010 07:12
quelle
4

Sagen Sie dem Code-Writer zuerst, dass er nicht new als Variablennamen verwenden soll - es ist ein Schlüsselwort. Erinnern Sie sich auch an return result; . Und übergeben Sie entweder const-reference oder modifizieren Sie direkt den new bag.

Innerhalb einer Struktur / Klasse ist this ein Zeiger auf sich selbst. Daher ist *this eine Referenz auf die gesamte Bag-Instanz selbst.

Die Anweisung Bag result(a_bag_reference) ruft den Kopierkonstruktor von Bag auf, wodurch eine Kopie von a_bag_reference in result erstellt wird.

Deshalb

%Vor%

erstellt eine Kopie von sich selbst und speichert sie dann in result . Dies macht die nächsten 2 Anweisungen

%Vor%

wirkt sich nicht auf die Instanz selbst aus (d. h. this->x und this->y werden konstant gehalten).

    
kennytm 28.03.2010 06:41
quelle
2

Die Funktion operator+ gibt eine Kopie zurück. Die Aussage:

%Vor%

Erstellt eine Kopie von diesem Objekt, um zum Aufrufer zurückzukehren. Gemäß der Signatur muss es einen Wert zurückgeben, also erstellt es eine Kopie und fügt dann das Objekt new hinzu.

    
Thomas Matthews 28.03.2010 06:41
quelle
2

Bag result(*this); deklariert eine Variable result und ruft ihren Kopierkonstruktor auf.

Sie können sich vorstellen, dass C ++ automatisch einen Standard-Kopierkonstruktor für alle Klassen deklariert. Seine Aufgabe ist einfach ein Objekt mit einem anderen Objekt zu initialisieren:

%Vor%

Der Ausdruck *this mag ein wenig beunruhigend wirken, ist aber nur der übliche Horror von C ++, wenn Sie mit & -Parametern umgehen.

    
David Leonard 28.03.2010 07:33
quelle