Rückgabe einer Referenz aus einer Funktion in C ++

Es ist möglich, eine Referenz aus einer Funktion zurückzukehren. Aber seien Sie vorsichtig, wenn Sie versuchen, dies zu tun: Sie wollen nicht einen Verweis auf eine lokale Variable in einer Funktion zurückzukehren - weil, wenn die Funktion beendet ist, geht der Speicherplatz für die lokalen Variablen entfernt. Nicht gut!

Aber Sie können einen Verweis auf eine globale Variable zurück. Oder, wenn die Funktion eine Elementfunktion ist, können Sie einen Verweis auf eine Membervariable zurück.

Zum Beispiel, hier ist eine Klasse, die eine Funktion hat, die einen Verweis auf eine ihrer Variablen zurückgibt:

Klasse DigInto {private: int secret-public: DigInto () {secret = 150-} int GetSecretVariable () {return Secret-} void Write () {cout lt; lt; Geheimnis lt; lt; endl-}} -

Beachten Sie den Konstruktor speichert 150 in der Geheimnis Variable, die privat ist. Das GetSecretVariable () Funktion gibt einen Verweis auf die private Variable namens Geheimnis. Und das Schreiben() Funktion schreibt den Wert des Geheimnis Variable. Viele Geheimnisse hier! Und einige Überraschungen zu. Sie können diese Klasse wie so verwenden:

int main (int argc, char * argv []) {DigInto inst-inst.Write () - int hebeln = inst.GetSecretVariable () - hebeln = 30-inst.Write () - Rückkehr 0-}

Wenn Sie dies ausführen, sehen Sie die folgende Ausgabe:

15030

Die erste Zeile ist der Wert in der geheimen Variable direkt nach der Anwendung die Instanz erstellt. Aber schauen Sie sich den Code sorgfältig: Die Variable mit dem Namen neugierig sein in eine ganze Zahl ist eine Referenz, und es wird die Ergebnisse GetSecretVariable (). Und was ist das Ergebnis?

Es ist ein Verweis auf die private Variable namens Geheimnis - was bedeutet, dass neugierig sein selbst ist nun ein Verweis auf diese Variable. Ja, eine Variable außerhalb der Klasse bezieht sich nun direkt an einem privaten Mitglied der Instanz! Danach legen Sie neugierig sein auf 30. Wenn Sie anrufen Schreiben() erneut zu ändern, wird in der Tat die private Variable.

Heißt das wie eine schlechte Idee zu sein? Sie machen die Variable privat. Und nun die GetSecretVariable () Funktion so ziemlich jeden Sinn für die Variable privaten tatsächlich verbleibenden weggewischt. Das Main() Funktion konnte einen Verweis auf sie zu packen und herumzustochern und ändern Sie es aber wollte es, als ob es nicht privat waren! Trouble in C ++ Land!

Das ist ein Problem mit Referenzen: Sie können möglicherweise verlassen Sie den Code weit offen. Daher zweimal überlegen, bevor Sie einen Verweis auf eine Variable zurück. Hier ist eines der größten Risiken: Jemand anders könnte diesen Code verwenden, können keine Referenzen zu verstehen und können nicht erkennen, dass die Variable mit dem Namen neugierig sein hat eine direkte Verbindung zum privaten Geheimnis Variable.

Solch ein unerfahrener Programmierer könnte dann Code schreiben, und Änderungen verwendet neugierig sein - ohne zu bemerken, dass die Membervariable zusammen mit ihm verändert. Später, dann a Fehler Ergebnisse - ein ziemlich böse, dass ein auf!

Da Funktionen Rückkehr Referenzen ahnungslosen und weniger erfahrene C ++ Programmierer mit nur ein klein wenig zu viel Macht auf ihre Hände verlassen können, seien Sie vorsichtig mit Referenzen. Nein, Sie müssen sie nicht vermeiden altogether- nur vorsichtig sein. Verwenden Sie sie nur, wenn Sie wirklich das Gefühl, Sie müssen. Aber denken Sie daran, dass ein besserer Ansatz in Klassen ist Mitglied Zugriffsfunktionen zu haben, die die privaten Variablen schützen können.

Allerdings können Referenzen sehr mächtig sein, vorausgesetzt, Sie verstehen, was sie tun. Wenn Sie eine Referenz verwenden, können Sie einfach eine andere Variable verändern, ohne durch Zeiger zu gehen - das Leben kann manchmal viel einfacher. Also, bitte: Verwenden Sie Ihre neu gewonnenen Kräfte sorgfältig.

Menü