Überladen von Operatoren
-
Hallo zusammen!
Number & Number::operator-(void) { Number A(*this) A.m_Value = -m_Value; return A; }
Wieso liefert die obige Funktion NICHT den negierten Wert und
folgende schon ?Number & Number ::operator -(void) { m_Value = -m_Value; return *this; }
Weiters würd ich gerne wissen welchen Unterschied es macht wenn man & verwendet oder nicht funktionieren tut beides!
thx
-
PapaJoey schrieb:
Hallo zusammen!
Number & Number::operator-(void) { Number A(*this) A.m_Value = -m_Value; return A; }
Nach meinem Verständnis dürfte obiger Code nicht das gewünschte Resultat erzielen, da du eine Referenz auf ein lokales Objekt zurückgibst.
Weiters würd ich gerne wissen welchen Unterschied es macht wenn man & verwendet oder nicht funktionieren tut beides!
Der "Adress-Operator" liefert dir eine Referenz auf den return-Wert. D.h du gibst den Return-Wert _direkt_ zurück (Keine Kopie).
BTW: Meines Erachtens aber ist diese operator-Funktion zum negieren falsch designt, da sie ja bei dir das Objekt selbst verändert (Wenn die Funktion eine Referenz auf den Return-Wert zurückgibt) und dies nicht immer wünschenswert sein kann.
Caipi
-
PapaJoey schrieb:
Hallo zusammen!
Number & Number::operator-(void) { Number A(*this) A.m_Value = -m_Value; return A; }
Wieso liefert die obige Funktion NICHT den negierten Wert und
folgende schon ?Wie schon Caipi sagte, gibst du eine Referenz zurück auf ein Objekt, welches innerhalb der Funktion erstellt wurde.
PapaJoey schrieb:
Number & Number ::operator -(void) { m_Value = -m_Value; return *this; }
Hier müsste natürlich alles wunderbar funktionieren, aber dass der Operator dein Attribut verändert und nicht nur ein Objekt mit verändertem Attribut zurückgibt, ist bestimmt nicht Sinn der Sache!
PapaJoey schrieb:
Weiters würd ich gerne wissen welchen Unterschied es macht wenn man & verwendet oder nicht funktionieren tut beides!
Kommt drauf an, wo das & steht. Als Adressoperator vor der Rückgabe (return) gibt er die Adresse deines Objekts (bzw. Attributs), aber du meinst wahrscheinlich das & vor dem Funktionsnamen, richtig? Damit sagst du, dass der Rückgabetyp eine Referenz ist, was meistens gut, gerade in deinem Fall aber der Fehler ist! Probiere mal folgendes Beispiel:
Number Number::operator-(void) { Number A(*this) A.m_Value = -m_Value; return A; }
Fast wie deine erste Version, nur ohne die Referenz. Das Objekt A wurde erzeugt, sein Attribut m_Value negiert und das Objekt zurückgegeben, wobei es per Copy-Construktor bei der Rückgabe kopiert wird. Wenn das Ergebis nun wieder nicht negiert ist, schau mal, ob im Copy-Kunstruktor auch m_Value kopiert wird!