Operatorüberladung
-
#include <iostream> using namespace std; class test { }; ostream& operator<<(ostream& os, const test& d) { return os << "hallo"; // Wieso eine Referenz zurückgeben? } int main() { test t; cout<<t; return 0; }Warum muss man hier eine Referenz zurück geben?
-
Kennst du diese Schreibweise?
std::cout << 1+1 << " = " << x << "\n" <<std::endl; std::cin >> a >> b >> c;Und genau dafür sit die Rückgabe da, eine Referenz ist es deswegen, weil man einen Stream nicht kopieren kann (ist verboten).
-
Skym0sh0 schrieb:
eine Referenz ist es deswegen, weil man einen Stream nicht kopieren kann (ist verboten).
Das ist nicht der Grund. Man würde auch eine Referenz nehmen, wenn Streams kopierbar wären.
Man will hier keine Kopie, sondern das originale Objekt. Erst durch die Referenz wird die Verkettung mehrerer Operationen auf einem Objekt möglich.
-
Warum muss überhaupt ein Wert zurück geben werden? Es wird da doch nur das Objekt verändert.
#include <iostream> using namespace std; void foo_1 ( int &v ) { v = 8; } int foo_2 ( int &v ) { v = 8; return v; } int main() { int a = 20; foo_1 ( a ); cout<< a << "\n"; cout << foo_2 ( a ) << "\n"; return 0; }Wenn ich doch hier z.b. nur die Variable a verändern will dann brauch ich da ja kein return in den foo Funktionen.
Auch bei der Operatorüberladung sehe ich nicht den Sinn des Rückgabewertes.
-
overL schrieb:
Auch bei der Operatorüberladung sehe ich nicht den Sinn des Rückgabewertes.
-->
Skym0sh0 schrieb:
Kennst du diese Schreibweise?
std::cout << 1+1 << " = " << x << "\n" <<std::endl; std::cin >> a >> b >> c;anders geschrieben ist das
operator<<(operator<<(operator<<(operator<<(std::cout, "\n"), x), " = "), 1+1);kann sein, dass ich mich da jetzt bei der Auswertungsreihenfolge vertan habe. Aber zur Demonstration des Prinzips sollte es reichen.
-
@overL:
Was wird denn in deinem Beispiel ausgegeben?
Oder lässt es sich überhaupt kompilieren?
-
In welchem meiner Beispiele?
Beide Beispiele lassen sich compilieren, beim ersten wird der String hallo ausgeben und beim anderen zweimal die 8.
-
overL schrieb:
Beide Beispiele lassen sich compilieren...
...und haben nichts miteinander zu tun, da du in deinen Beispielen keine Funktionsverkettung machst.
Würdest du void zurückliefern, könntest du keine Verkettung durchführen. Die Verkettung von "<<" ist nur möglich, da jeweils wieder die ostream-Referenz zurückgegeben wurde (Diese Rückgabe wird als erstes Argument des nächsten Funktionsaufrufes von operator<< als linkes Argument verwendet). daddy_felix hat geschrieben wie in etwa operator<< miteinander verkettet wird (Es ist einfach eine Funktionsverschachtelung, bei dem das erste Argument aus dem vorherigen Aufruf übernommen wird).
-
Habs verstanden:
cout << hex << "cout addr1: " << cout << "\n"; cout << "cout addr2: " << operator<<(cout,"ok");Jetzt leuchtet mir das auch ein.^^
-
daddy_felix schrieb:
Skym0sh0 schrieb:
Kennst du diese Schreibweise?
std::cout << 1+1 << " = " << x << "\n" <<std::endl; std::cin >> a >> b >> c;anders geschrieben ist das
operator<<(operator<<(operator<<(operator<<(std::cout, "\n"), x), " = "), 1+1);kann sein, dass ich mich da jetzt bei der Auswertungsreihenfolge vertan habe. Aber zur Demonstration des Prinzips sollte es reichen.
Das reicht mit Sicherheit. Trotzdem...
<klugscheiss>
...es sind auch Überladungen des memberoperator<<()dabei (für denintund denendl-Manipulator - und vielleicht auch für x). Alsostd::string x = "Furble Wurble war hier"; // beispielhaft... operator<<(operator<<(operator<<(std::cout.operator<<(1+1), " = "), x), "\n").operator<<(std::endl);</klugscheiss>