2010-02-07 11 views
9

Wenn eine Funktion einen int zurückgibt, kann sie durch einen int-Wert zugewiesen werden? Ich sehe nicht, dass es zu viel Sinn macht, einer Funktion einen Wert zuzuweisen.Wenn eine Funktion einen int zurückgibt, kann ihr ein int zugewiesen werden?

Ich bemerkte, dass, wenn die Funktion einen Verweis auf ein int zurückgibt, es in Ordnung ist. Ist es nur auf int beschränkt? Wie wäre es mit anderen Arten? oder irgendwelche anderen Regeln?

+1

Was wäre der Punkt, um einer Funktion einen Wert zuzuweisen? Warum nicht stattdessen eine Variable verwenden? –

Antwort

22

Die erste Funktion gibt einen Integer-by-Wert zurück, der ein r-Wert ist. Sie können einem r-Wert im Allgemeinen nicht zuweisen. Das zweite f() gibt einen Verweis auf eine ganze Zahl zurück, die ein l-Wert ist - also können Sie ihm zuweisen.

int a = 4, b = 5; 

int& f() {return a;} 

... 
f() = 6; 
// a is 6 now 

Hinweis: Sie weisen der Funktion keinen Wert zu, sondern weisen nur ihren Rückgabewert zu. Seien Sie mit der folgenden Vorsicht:

int& f() { int a = 4; return a; } 

Sie einen Verweis auf eine vorübergehende Rückkehr, die nach der Funktion zurückkehrt nicht mehr gültig ist. Der Zugriff auf die Referenz ruft undefiniertes Verhalten auf.

+0

könnten Sie erklären, warum Rückgabewert ein r-Wert ist? – skydoor

+0

Der Rückgabewert einer Funktion ist keine richtige C++ - Variable wie "int i;". Es ist nur ein vorübergehender Wert. Es stellt keinen Speicherort dar. –

+1

@skydoor, kann mit * zusammengefasst werden "Sie können nur Objekten zuweisen" *. In Ihrem Aufruf gibt die Funktion einen Wert zurück, der keinem Objekt entspricht: Die ganze Zahl repräsentiert * nur * einen abstrakten Wert.Wenn Sie zum Beispiel eine 'std :: string 'zurückgegeben haben, entspricht der zurückgegebene Wert (der eigentlich ein r-Wert ist) einem String-Objekt, und Sie könnten * ihm * zuweisen. Dasselbe gilt für einen "int &" Rückgabewert. In diesem Fall entspricht der zurückgegebene "Wert" (der ein l-Wert ist) einem int * -Objekt *, und Sie können ihm zuweisen. Ein Objekt ist notwendig, da eine Zuweisung einen gespeicherten Zustand verändert. –

1

Es ist nicht nur auf int begrenzt, aber für die primitiven Typen gibt es keinen Sinn. Es ist nützlich, wenn Sie Ihre Klassen haben

+1

Willst du sagen, dass es keinen Sinn hat, einen Verweis auf einen primitiven Typ zurückzugeben? Dinge wie 'operator []' von 'vector ' sind sinnlos? – sepp2k

+1

Es gibt eine Menge zu tun es (wenn Sie es bedeuten, dass Sie eine Referenz zurückgeben) - wenn Sie einen Std :: Vektor haben, dann die Funktionen, die auf Dinge im Vektor zugreifen zurück int Referenzen. –

+0

Im Zusammenhang mit seinem Beispiel – anthares

0

Wenn eine Funktion von Wert ein Objekt zurückgibt, dann ist Zuordnung möglich, auch wenn der Funktionsaufruf ein rvalue. Beispiel:

std::string("hello") = "world"; 

Dadurch wird ein temporäres String-Objekt erstellt, mutiert und sofort zerstört. Ein praktisches Beispiel ist:

some_function(++list.begin()); 

Sie nicht list.begin() + 1 schreiben könnte, da der Zusatz auf Liste Iteratoren nicht möglich ist, aber Zuwachs ist in Ordnung. Dieses Beispiel beinhaltet keine Zuweisung, aber die Zuweisung ist nur ein Spezialfall der allgemeineren Regel "Mitgliederfunktionen können auf R-Werten aufgerufen werden".

+0

Es ist ein häufiger Fall? Kannst du mir ein Beispiel geben? – skydoor

+1

Während ich verstehe, dass es nur ein Beispiel ist, beachten Sie, dass '++ list.begin()' nicht benötigt wird, um zu funktionieren. Der Operator kann als eine freie Funktion implementiert werden, die eine nicht-konstante Referenz akzeptiert und nicht an den temporären Iterator binden kann. –

+1

Danke, ich kann mich nie erinnern, welche Operatoren Mitgliederfunktionen haben und welche freie Funktionen sein können. – fredoverflow