Was bedeutet es für die Rückgabe einer Referenz?
Ich verstehen, das Konzept der Referenzen in C++, und ich verstehe, was Sie tun werden, wenn in Parameter der Funktion, aber ich bin immer noch sehr verwirrt darüber, wie Sie arbeiten mit Rückgabetypen.
Beispielsweise, wenn in Parameter, dieser code:
int main (void) {
int foo = 42;
doit(foo);
}
void doit (int& value) {
value = 24;
}
ähnlich wie in diesem code:
int main (void) {
int foo = 42;
doit(&foo);
}
void doit (int* value) {
*value = 24;
}
(im wissen, dass der compiler automatisch ein Sternchen vor Wert jedes mal, wenn es verwendet wird, in der ersten code-Beispiel von doit, aber in der letzteren würden Sie haben, um den Stern in sich selbst jedes mal, wenn Sie versuchen, verwenden Sie Wert)
So, wenn als Referenz verwendet, was bedeutet dieser code (Verwendung der Referenz in einem return-Typ) zu übersetzen? Hat es wieder einen Zeiger auf ein int? Oder würde es nur int zurückgeben?
int main (void) {
int* foo = /*insert useful place in memory*/;
foo = doit(foo);
}
int& doit (int* value) {
//insert useful code
}
- Würde es wieder eine Referenz auf eine int, Eine Referenz, die Sie an denken können als namens-Zeiger, aber ohne all die rohe Kraft von einem Zeiger. Das große problem mit allen, die , Rückgabe einer Referenz auf ein Objekt, dass sehr wahrscheinlich wird auf dem Stapel erzeugt wird, dass Ihr gehen zu müssen, einige böse Speicher-Probleme, wenn die Funktion zurückgibt und Funktionen-stack wird aufgeräumt. Also , seien Sie sich dessen bewusst, dass, nur weil es einen Hinweis, dass die Dosis NICHT bedeuten, dass Sie haben keine Speicher Probleme, und mit Referenzen, es ist wirklich noch schlimmer, weil das Speicher-Problem versteckt ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es bedeutet, dass Sie zurückkehren, indem Sie auf die Referenz, die ist, zumindest in diesem Fall wohl nicht gewünscht. Im Grunde bedeutet es, der zurückgegebene Wert ist ein alias auf das, was Sie von der Funktion zurückgegeben. Es sei denn, es ist ein persistentes Objekt, das es illegal ist.
Beispiel:
legal wäre und drucken Sie
2
, weilfoo() = 2
ändert den tatsächlichen Wert zurückgegebenfoo
.Jedoch:
illegal wäre (gut, der Zugriff auf den Rückgabewert würde), weil
x
zerstört wird, wenn die Methode beendet, so würden Sie Links mit einem baumelnden Referenz.Rückgabe per Referenz ist nicht üblich für freie Funktionen, aber es ist für Methoden wieder Mitglieder. Zum Beispiel, in der
std
, dieoperator []
für Allgemeine Container Rückgabe durch Referenz. Beispiel: Zugriff auf Elemente eines Vektors mit[i]
gibt eine tatsächliche Referenz zu diesem element, sov[i] = x
tatsächlich ändert, dass element.Ich hoffe auch, dass "im wesentlichen gleich diesem code" bedeutet, dass Sie semantisch in gewisser Weise (aber nicht wirklich) ähnlich. Nichts mehr.
Bedeutet es, dass Sie zurück einen Zeiger auf die Speicheradresse, wo der Korrespondent Daten, anstatt die Daten sehr.
Vorausgesetzt, dieser code (vergleichbar zu machen, um das erste Beispiel) :
Den
int&
ist nicht wirklich nützlich, da ein return-Typ in diesem Fall, weil es bietet Zugriff auf die variable im Speicher (von denen übergeben Sie den Zeiger an die Funktion).Nein, es gibt einen Verweis auf ein int. Wenn Sie möchten, können Sie betrachten es als einen pointer, die können nicht
nullptr
.Hmm, der beste Weg, zu wissen, dass die Antwort, einen Versuch zu haben...
Ihre codes wird nicht passieren-Typ überprüfen, weil doit zurückkehren wird, ein Verweis auf int, während Sie akzeptieren die Rückgabe-Wert als Zeiger int.
Können Sie einen Blick auf diese:
Die variable "bar" wird die den Rückgabewert aufnimmt, und es kann verwendet werden, ändern Sie den Inhalt des "foo". Wie erwähnt Luchian, der es vielleicht gefährlich für die Rückgabe einer Referenz von der Funktion, denn die später-codes ändern Sie einen Wert in den stack.