Hier ist ein Beispiel für Friend-Funktionen im Internet gefunden:Local varible (Stack) zurückgegeben als Funktion Rückgabewert
#include <iostream>
using namespace std;
class Rectangle {
int width, height;
public:
Rectangle() {}
Rectangle(const Rectangle &r) {
width = r.width;
height = r.height;
cout << "copy\n";
}
Rectangle (int x, int y) : width(x), height(y) {}
int area() {return width * height;}
friend Rectangle duplicate (const Rectangle&);
};
Rectangle duplicate (const Rectangle& param)
{
Rectangle res;
res.width = param.width*2;
res.height = param.height*2;
return res;
}
int main() {
Rectangle foo;
Rectangle bar (2,3);
foo = duplicate (bar);
cout << foo.area() << '\n';
return 0;
}
Ausgang:
24
Beachten Sie, dass der Freund "Duplikat" Funktion erstellt eine lokale Variable und gibt als Rückgabewert an den Aufrufer zurück. Soll das nicht eine lokale Variable sein und wird auf diesem Stack vergeben? Sollte es nicht zerstört werden, sobald "duplicate" die Ausführung beendet hat? Ist dieses Beispiel gut?
Danke.
Rückgabe der Variablen erstellt eine Kopie davon. – Barmar
Konzeptuell wird die lokale Variable 'res' auf dem Stack erstellt und dann in den Rückgabewert verschoben. Anschließend wird der Destruktor der lokalen Variablen ausgeführt.In der Praxis optimiert der Compiler diese Verschiebung – Justin
Der einzige Fall, in dem dies nicht funktioniert, ist, wenn Sie versuchen, ein Array zurückzugeben, weil Arrays zu Zeigern zerfallen, wenn Sie sie zurückgeben, und der Zeiger auf ein zerstörtes Objekt zeigt. – Barmar