Referenz als Rückgabe
-
Ich habe mal eine Frage zu Referenzen als Rückgabetyp.
Wann genau macht sowas Sinn? Beispiel:string & func(string &temp) { return temp; }Für mich gibt es nur 2 Fälle:
1. Ich kann die Funktion als Lvalue fungieren lassen, und sozusagen über den Rückgabewert "temp" dass Argument verändern (solange es eine Variable und keine literal konstante ist [hierzu müsste der Parameter aber ja "const" sein])
2. In meinem Buch steht, normalerweise wird bei der Rückgabe ein temporäres Objekt erstellt (also eine Kopie), außer wenn ich etwas über eine Referenz zurückgebe. Und nun zu meiner Frage: Dass macht aber doch nur Sinn, wenn die Rückgabe wieder auf eine Referenz erfolgt (was dann langsam ziemlich konfus wird (!!!), und ich meinen Rückgabetyp in "const" umändern sollte). Beispiel:string wort = "Haus"; string &a = func(wort); string b = func(wort); //weil hier würde ja wieder eine Kopie stattfinden? Also gehts doch nur wenns wieder auf eine Referenz übergeben wird.Sind meine Gedanken da richtig? Oder verstehe ich was diesen Punkt anbelangt etwas falsch?
Wann macht die Referenz eurer Meinung nach noch Sinn?MfG
Stromberg
-
Hatten wir auch erst gerade so ähnlich:
http://www.c-plusplus.net/forum/viewtopic-var-p-is-1828077.htmlAber grundsätzlich hast du recht. Gebraucht wird das vor allem, wenn man etwas eleganter hinschreiben will und so eine Verkettung von Funktionsaufrufen hat. ( wie eben z.B bei den Stream Operatoren).
-
Stromberg schrieb:
Sind meine Gedanken da richtig?
Ja, da hast du Recht. Wenn man allerdings allfällige Compileroptimierungen weglässt, erzeugt der folgende Code ohne Referenzrückgabe zwei Kopien:
string func(string& temp) { return temp; // Rückgabe: erste Kopie } // Zuweisung: zweite Kopie string b = func(wort);In der Praxis können solche temporären Objekte aber gut wegoptimiert werden. Nun, Referenzen als Rückgabetypen braucht man trotzdem. Ein bekannter Fall, wo gleich ein Parameter wieder zurückgegeben wird, ist ein globaler Streamoperator:
std::ostream& operator<<(std::ostream& stream, const MyClass& obj);Ansonsten (nicht als Weiterleitung von Argumenten) machen zurückgegebene Referenzen bei freien Funktionen wenig Sinn, weil diese auf lokale automatische (sehr böse), statische (selten) oder globale Variablen (meist unschön) zeigen müssten.
Hingegen verwendet man bei Memberfunktionen ab und zu Referenzrückgaben, wenn auch meistens
const-qualifiziert (Referenzen auf veränderbare Ziele zurückzugeben hebelt das Prinzip von Getter und Setter aus). Manche Leute sind sogar der Ansicht, Const-Referenzen verletzen die Kapselung. Ich persönlich halte solche Pauschalaussagen für Unsinn. Natürlich kann in einzelnen Fällen eine Kopie sinnvoller sein, aber eine Referenz ist erstens schneller und zweitens je nach Semantik die einzige Möglichkeit (z.B. bei nichtkopierbaren Objekten).