Referenz als Rückgabewert
-
WebFritzi schrieb:
3. Es wird ein int r auf dem Stack reserviert und mit dem Wert 2 gefüllt
4. Der Wert von r wird zu g rüberkopiert, so dass g mit 2 gefüllt wird
5. Der Speicher, den r belegte, wird wieder freigegebenNein, eigentlich wird beim return zunächst ein temporäres Objekt erzeugt (als Kopie von r), dann wird r zerstört, und dann wird r (bzw. das temporäre Objekt) an g zugewiesen. Diese Erzeugung des temporären Objekts per Kopierkonstruktor kann mittels der schon angesprochenen Named Return Value Optimization (NRVO) vermieden werden. Was das ist, siehe Hume's FAQ: http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=Optimize#Answ
Edit: Aber du arbeitest hier mit int-Objekten, die werden auch ganz gerne mal in Registern (%eax) zurückgegeben, da ist diese NRVO-Geschichte nicht wirklich von Belang
Zweite Frage: Was bedeutet const am Ende einer Funktionsdeklaration?
CString CString::ToUpper() const;
Das bedeutet, dass ToUpper die Membervariablen seines CString-Objektes nicht verändern kann. Das erlaubt es, diese Methode auch auf const-Objekte aufzurufen. Siehe dein Lieblings-C++-Lehrbuch (vom Level her gehören die beiden Fragen eigentlich nicht annähernd in denselben Thread :þ )
-
Nein, eigentlich wird beim return zunächst ein temporäres Objekt erzeugt (als Kopie von r), dann wird r zerstört, und dann wird r (bzw. das temporäre Objekt) an g zugewiesen
OK ich habe einen Stack. Da sind schon irgendwelche Werte drauf, die mich jetzt nicht interessieren. Dann werfe ich r drauf. Darauf lege ich ein temporäres Objekt. Jetzt habe ich ein Problem: Wie bekomme ich r vom Stack "gepopt", ohne vorher das temporäre objekt zu "popen".
-
Der Platz für den Rückgabewert wird schon vor dem Aufruf der Funktion freigemacht. Dh r liegt über dem temp-Objekt, und kann dann ganz normal runtergepoppt werden.
-
Ah, OK.