Wieso operator + mit += implementieren??
-
Einfach mal John Potters Erklärung lesen. Dazu noch den nächsten Beitrag von Daniel Frey.
Variante 1 ist die schlechteste Alternative.
Am Besten:const foo operator +(const foo& lhs, const foo& rhs) { foo rv(lhs); rv += rhs; return rv; }
Das finde ich wirklich mal toll: Der Code, der am Besten zu lesen ist und am wenigsten nach "besonders-clever" aussieht, ist gleichzeitig auch der effizienteste.
<edit>Tippfehler in Rückgabewert korrigiert!
Natürlich liefert der op+ sein Ergebnis als Wert und nicht als Referenz.</edit>
-
referenz auf ein temporary?
Klar, man spart sich eine Kopie, dafür muß man jedem Nutzer einbleuen, sofort eine Kopie zu ziehen... Effektiver, aber gefährlicher. Würde ich nicht als "am besten" bezeichnen.Ich seh auch an Herrn Potters Erklärungen a) keine anderen Varianten und b) keine Vorteile. Oder hab ich was übersehen?
-
peterchen schrieb:
referenz auf ein temporary?
tippfehler.
-
HumeSikkins schrieb:
Einfach mal John Potters Erklärung lesen. Dazu noch den nächsten Beitrag von Daniel Frey.
Variante 1 ist die schlechteste Alternative.
Am Besten:foo& operator +(const foo& lhs, const foo& rhs) { foo rv(lhs); rv += rhs; return rv; }
Hier wird doch ne Refernz auf ne lokale Var. zurückgegeben. Ist das nicht illegal?
-
interpreter und peterchens Beitrag, sowie dieser haben sich erledigt.
-
Ich dachte, Volkard hatte sich verschrieben
-
HumeSikkins schrieb:
Am Besten:
foo& operator +(const foo& lhs, const foo& rhs) { foo rv(lhs); rv += rhs; return rv; }
Ich hoffe dir ist aufgefallen das eine Warning geworfen wird bei dem code:
main.cpp(54) : warning C4172: returning address of local variable or temporary
-
Ja, genau darüber wurde in den letzten 4 Beiträgen gesprochen. Es handelt sich um einen Tippfehler, das & im Typ des Rückgabewerts muß weg.
-
Jester schrieb:
Ja, genau darüber wurde in den letzten 4 Beiträgen gesprochen. Es handelt sich um einen Tippfehler, das & im Typ des Rückgabewerts muß weg.
lol sorry habs überlesen
-
Hallo,
sorry für die Verwirrung die ich durch diesen ärgerlichen Copy&Paste-Fehler gestiftet habe
Der Rückgabewert sollte natürlich const foo sein.
Ich werde das jetzt korrigieren
-
Womit spätere Leser bei den Kommentaren und Zitaten verwirrt sein werden.
-
Jester schrieb:
groovemaster2002 schrieb:
Variante 1 kann mein Compiler teilweise besser optimieren. Allerdings kann es uU Compilerfehler geben, wenn die Klasse aligned ist.
Kannst Du das genauer erklären?
Warum der Compiler das teilweise besser optimiert, kann ich dir nicht sagen. Aligned heisst einfach, dass Strukturen (bzw. Klassen) im Speicher an einer entsprechenden Grenze ausgerichtet werden. Das ist dann sinnvoll, wenn du zB SSE verwendest, wo teilweise aligned Adressen benötigt werden. Viele Compiler bieten dafür spezifische Schlüsselwörter (zB MSC __declspec(align(...))). Wird das Objekt also per Referenz übergeben gibt es keine Probleme. Muss der Compiler das hingegen auf dem Stack per Kopie ablegen, gibts Fehler, da er nicht weiss ob die Stackadresse immer noch dem Alignment entspricht.
btw:
Die Rückgabe als Referenz war natürlich falsch. Darf ich mal fragen, wieso Hume const foo als Rückgabetyp nimmt und nicht foo?
-
Weil sonst ich herkomme und schreibe:
a + b = c;
-
Der von HumeSikkins als bester bewertete Code deckt sich mit dem von Herb Sutter (s.o.):
const Complex operator+( const Complex& lhs, const Complex& rhs ) { Complex ret( lhs ); ret += rhs; return ret; }
-
Optimizer schrieb:
Weil sonst ich herkomme und schreibe:
a + b = c;
Nope. Das könntest du nicht.
-
Dope. Das könnte ich schon.
class Integer { public: Integer(int x) : value(x) {} int value; }; Integer operator+(const Integer& a, const Integer& b) { return Integer(a.value + b.value); } int main() { Integer a(2), b(3), c(8); a + b = c; }
-
Wieder was gelernt
-
... und wieder: http://www.gotw.ca/gotw/004.htm (Herb Sutter)
... Note that this return type should be "const Complex" (not just "Complex") in order to prevent usage like "a+b=c".