operator << vs. operator= links -> rechts oder rechst -> links?
-
Hi,
Diese Frage bezieht sich auf die links- und rechts-haendigen Argumente der operator<< und operator== (assigment) in den folgenden Zeilen:
Zeile 1: myclass1 = myclass2 = myclass3; // Class type MyClass
Zeile 2: cout << myclass1 << myclass2 << myclass3 << endl;Obenstehendes funktioniert hervorragend wenn operator<< und operator= (assigment) ueberladen sind fuer MyClass:
MyClass & MyClass::operator=(MyClass & rhs);
ostream & operator<<(ostream & os, MyClass & myclass);QUESTION:
------------------
Zeile1 wird von rechts nach links verarbeitet, wobei myclass 3 das "rhs" Argument vom meist rechten operator= ist. Das Resultat wird dann das "rhs" vom naechten, meist linken, operator=.So far, so good.
Aber dann Zeile2: Ausgefuehrt von rechts nach links? Wenn ja, das meist rechte operator= nimmt dann eine MyClass& als l-value und einen Strom als r-value. Und so einen operator gibt's nicht (nicht von mir auf jeden Fall in diesem Code!).
Also, wie funktioniert das denn hier??
SUGGESTION: Is the line 2 executed from left to right in stead? In that
case I could understand the operator logic at least ... but then: what with
the reversed order???M.fr.Gr.,
Ytsen.
-
Zeile 2 könnte man auch so schreiben
endl(operator<<(operator<<(operator<<(cout, myclass1), myclass2), myclass3))
Ich denke dann wird es klarer.
-
Nur die einstelligen sowie die Zuweisungsoperatoren sind rechtsbindend, alle anderen Operatoren sind linksbindend (wie man es von den mathematischen Operatoren auch gewohnt ist).
Obwohl der << Operator hier als Streaming-Operator benutzt wird (anstatt als Linksschieben), so bleibt dessen Priorität und Bindung erhalten.
-
Braunstein schrieb:
Zeile 2 könnte man auch so schreiben
endl(operator<<(operator<<(operator<<(cout, myclass1), myclass2), myclass3))
Ich denke dann wird es klarer.
Danke fuer den Hinweis!!, ich glaube ich muss mal ein wenig diese Stroeme studieren
Cheers,
Ytsen.