Unterschied zwischen Operator Überladung
-
Aber was bedeutet diese Zeile?
Vektor h(*this);
Ich versteh das irgendwie nicht ganz!
-
h wird als Vektor deklariert und mit *this initialisiert. Da *this vom Typ Vektor ist, wird also der Kopierkonstruktur aufgerufen. h ist somit eine Kopie von *this.
Der Präfix-Operator sollte übrigens eine Referenz zurückgeben, damit er genauso funktioniert wie der eingebaute Präfix-Inkrement-Operator.
-
Okay, also zuerst erstelle ich eine Kopie von aktuellen Objekt:
Vektor h(*this);
so, nun incrementiere ich das aktuelle Objekt (aber nicht die Kopie)
wert[0]++;
wert[1]++;
Dennoch gebe ich die (nicht incrementierte) Kopie zurück
return h;
irgendwie peil ich das nicht.
-
Postfix-++ funktioniert eben so. Mal ein Beispiel mit int:
int a = 10; int b = a++;
Was passiert? b wird den Wert 10 haben und a den Wert 11, d.h. das Ergebnis des Ausdrucks a++ ist der alte Wert von a, und als Seiteneffekt wird a dabei erhöht.
-
Okay, dieses Beispiel verstehe ich ja.
b = 10
a = 11
am Ende
Aber in meintem Beispiel, wird ja das Objekt incrementiert und NICHT zurückgegeben, sondern die nicht incrementierte Kopie! Das peil ich nicht.Ist doch irgendwie eindeutig,
Vektor AndererWert(*this); wert[0]++; wert[1]++; return AndererWert;
ich will ja nicht behaupten dass du unrecht hast, ich kann nur keine logik darin sehen bzw. verstehe ich es einfach nicht!
-
Hallo,
Das ist doch genau das was Bashar im letzten Posting sagen wollte. Es wird eine Kopie zurück gegeben (also der Ausgangszustand). Das Object selbst wird zwar incrementiert gibt aber den noch nicht incrementierten wert zurück. So soll der Postincrementoperator ja auch funktionieren.
-
Achso, d. h. es ist ungefähr so wie wenn ich schreibe
a = 3
b = 0b = ++a;
a bleibt trotzdem 3, aber b ist 4.Hab ich das so richtig verstanden?
PS: heute Mittag bin ich ne Weile nichts ins Forum gekommen. CGI... irgendwie aufgebraucht oder so, liegts das an eurem Provider? Oder wieso?
MfG Giovanni
-
Giovanni Rena schrieb:
Achso, d. h. es ist ungefähr so wie wenn ich schreibe
a = 3
b = 0b = ++a;
a bleibt trotzdem 3, aber b ist 4.Hab ich das so richtig verstanden?
PS: heute Mittag bin ich ne Weile nichts ins Forum gekommen. CGI... irgendwie aufgebraucht oder so, liegts das an eurem Provider? Oder wieso?
MfG Giovanni
Es gibt wohl momentan Serverprobleme AFAIK.
Zu deinem Beispiel.
Ich glaub du hast es noch nicht richtg verstanden.int a=3; int b=0; b=++a; //b und a haben den Wert 4 b=a++; //b hat den Wert 4 und a hat den Wert 5 bei der nächsten Verwendung
++a erhöht a um 1 und weisst dann zu. a++ weisst den momentanen wert von a zu und erhöht a danach um 1.
-
a++ erst zuweisen, dann erhöhen!
++a erst erhöhen, dann zuweisen!
jetzt habs aber kapiert, danke prolog, und danke allen anderen!
-
Japp, jetz stimmts.
-
Giovanni Rena schrieb:
a++ erst zuweisen, dann erhöhen!
++a erst erhöhen, dann zuweisen!
jetzt habs aber kapiert, danke prolog, und danke allen anderen!Oder in "Fachsprache":
a++: fetch-and-increment
++a: increment-and-fetch
-
Vektor Vektor::operator ++ (int) { // Incrementiere Aktuelles Objekt // ++AktuellesObjekt Vektor Value; this->Value1++; this->Value2++; return Value; }
Schönen guten Morgen, eine Frage hätte ich noch. Der Parameter (int), eigentlich ist ja mein Datentyp mit dem ich arbeite double. So weit ich weiß, dient int nur dazu zwischen der anderen Increment-Funktion zu unterscheiden (a++). Ist es also vollkommen unwichtig ob ich mit double oder float arbeite, oder wie?
Gruß Giovanni
-
int dient wirklich nur der unterscheidung, weil der compiler den zeichenwust sonst nicht richtig auflösen könnte.
zu deinem code:
bei deinem operator wird ein leeres standardobjekt zurückgegeben, du musst das objekt erst mithilfe des copykonstruktors(Vektor Value(*this)) kopieren, weil die ganze sache sonst nichmehr stimmt.btw, die this zeiger bei deinen Values brauchst du nur, wenn sie vom namen her nicht mehr eindeutig sind(zb wenn du innerhalb der klasse eine methode hast, die eine variable mit dem namen Value1 beinhaltet).
-
kann es vielleicht auch sein, dass der compiler sieht dass es sich um nen numerischen parameter handelt und deshalb es unwichtig ist, ob es double oder int oder float ist. Und dadurch dass es eben nen numerischer parameter ist, ruft er die methode Vektor Vektor::operator ++ (int) auf.
wenn ich also nen int-wert incrementiere, ruft der compiler
Vektor Vektor::operator ++ (int)
auf, und wenn ich nen double wert incrementiere und "gleichzeitig" ne methode mit dem double-parameter mache, dann würde der compiler auch die funktion mit dem doupble-parameter aufrufen
Vektor Vektor::operator ++ (double)
weil diese eben mehr dazu passt, oder?ja, den rest den weiß ich. danke. ich schreibe aber immer tihs-> weil ich gerne solche methoden mache:
Vektor Vektor::operator/ (Vektor Value) { Ergebnis.Value1 = this->Value1 / Value.Value1; Ergebnis.Value2 = this->Value2 / Value.Value2; return Ergebnis; }
und da brauchts man zur unterscheidung...
-
nö.
Ergebnis.Value1=Value1 / Value.Value1;
ist absolut eindeutig
-
ja, gut dass mit this-> da hasts du recht, aber macht das wirklich was aus?
und wie ist es doch noch mal mit dem parameter, hatte ich da recht?