Operatorüberladung << : Warum Call-by-Reference ?
-
Hallo,
also ich habe irgendwie gerade ein Verständnisproblem mit der Püeratorüberladung des Operators <<.
Ich weiss wie das alles funktioniert, also wie ich diesen Operator überladen kann, verstehe aber nicht ganz, warum der outstream als Reference übergeben wird und vorallem warum dieser nicht als Kopie (Call-by-Value) übergeben werden kann (mit anschließender Rückgabe), sowie die Rückgabe selbst, die für mich irgendwie unlogisch ist, aber dazu nun genauer ://Classdeklaration mit Vorwärtsdeklaration class bruch; ostream& operator << ( ostream & out, bruch & alt ); //Class bruch class bruch { private: friend ostream & operator << ( ostream & out, bruch & alt ); int nenner; int zaehler; //... //... //... };//Main sieht meinetwegen so aus: int main() { bruch a(1,2); bruch b(2,4); bruch c = a + b; cout<<c<<endl; }//Operatorüberladung operator << ostream& operator << ( ostream & out, bruch & alt ) { out<<"zaehler : "<<alt.zaehler<<endl; out<<"nenner : "<<alt.nenner<<endl; return out; }Also die folgende Fragen bestehen weiterhin:
* Warum out und alt als Reference ?
(Bei alt kann ich mir das denken, eben wegen der Genauigkeit, dass genau das originale Objekt angesprochen wird, auf das Ambercent kann allerdings auch verzichtet werden)* Warum muss eine Reference von ostream bestehen, wenn ich im Endeffekt sowieso out wieder zurück gebe ?
* Warum gebe ich out zurück, wenn ich auf cout über out referenziere ?
* Wäre glücklich wenn mir da jemand etwas Licht ins Dunkel bringen könnte!
Liebe Grüße,
Maab.
-
Maab schrieb:
* Warum muss eine Reference von ostream bestehen, wenn ich im Endeffekt sowieso out wieder zurück gebe ?
ostream-objekte lassen sich nicht kopieren. per kopie gehts einfach nciht.
* Warum gebe ich out zurück, wenn ich auf cout über out referenziere ?
weil es nicht cout sein muss.
ofstream ou("C:\\autoexec.bat"); ou<<"echo haha\n";
-
BTW: Ih würde den auszugebenden Parameter "consten":
ostream& operator << ( ostream & out, bruch const & alt );Gruß,
Simon2.
-
Maab schrieb:
* Warum out und alt als Reference ?
(Bei alt kann ich mir das denken, eben wegen der Genauigkeit, dass genau das originale Objekt angesprochen wird, auf das Ambercent kann allerdings auch verzichtet werden)Zum ersten sind, wie Volkard schon sagte, Streams nicht kopierbar. Das hat aber auch einen Sinn. Ein Stream hat alles mögliche an internen Zuständen. Fehler, Speicherbelegung irgendwelche Handles zum Betriebssystem etc.
Es wäre daher schlichtweg auch falsch, eine Kopie erstellen zu können (weil ja irgendwelche halbgaren Zustände mitkopiert werden würden).
Außerdem willst Du ja genau den Stream modifizieren, für den Du den <<-Operator aufgerufen hast, und nicht irgendeine Kopie davon.
Beispielstd::cout << 4 << "Hallo\n";Hier willst Du konkret cout modifizieren, und keine Kopie von cout. Außerdem wird hier
operator<<2x aufgerufen (für jedes <<). Du übergibst also cout, packst die 4 in den Stream, gibst cout zurück, packst dass dann wieder in den operator und packst dann den String hinein. Oberatorverkettung wäre nicht möglich.Etwas klarer wird das ganze vielleicht sogar, wenn es um einen fstream geht. So ein Filestream stellt ja Deine Schnittstelle in eine Datei dar. Jetzt stell Dir vor, Du erstellst einen Filestream, und dann würde der kopiert werden. Dann hättest Du zwei verschiedene Streams, die jeweils in der gleichen Datei rumfuhrwerken können, und dabei auch noch unterschieldiche interne Zustände haben können. Das ist nicht so gut, oder?
Der zweite Parameter muss übrigens keine Referenz sein.