Oje, Referenzen als Rückgabetyp.



  • Hi!

    string buff("Hello, I am your string buffer!");
    
    string& get_buffer_as_reference()
    {
    	return  buff;
    }
    string get_buffer_as_string()
    {
    	return  buff;
    }
    

    Bringt mir das irgendwas, in irgendeinem Fall, eine Referenz zurückzugeben? Kann mir jemand ein Beispiel nennen?

    Ich habe mal das hier probiert:

    void show_buffer()
    {
    	cout << buff << endl;
    }
    
    int main() 
    { 
    	string rs = get_buffer_as_reference();
    	show_buffer();
    	string s = get_buffer_as_string();
    	show_buffer();
    	rs = "a";
    	show_buffer(); // keine Änderung!
    
        return 0; 
    }
    

    Obwohl ich eine Referenz zurückgegeben habe, hat die Zeile

    rs = "a";
    

    das Objekt nicht geändert. 😕



  • string& rs = get_buffer_as_reference();
          ^
          |
          |
    


  • string &rs = get_buffer_as_reference();
    

    Das Zurückgeben als Referenz spart in bestimmten Fällen auf jeden Fall den Kopierkonstruktor.



  • weil dein rs nicht den Typ string& sondern string hat. Das beduetet, dass der Inhalt der Referenz in ein neues Objekt kopiert wird. string rs stellt ein eigenständiges Objekt dar.

    Würest du es so machen:

    string& s = get_string_ref();
    s = "xyz";
    

    wäre dein string geändert.
    Hat verschiedene Anwendungsfälle:

    1. man möchte, dass das Objekt verändert werden kann und die Änderungen sollen permanent übernommen werden (wie in deinem Beispiel)
    2. man möchte sich das kopieren des Rückgabewertes ersparen. Möchte man dann verhindern, dass das Objekt verändert wird, kann auch const string& zurückgegebn werden.


  • So toll ist das aber alles nicht.
    Globale Variablen sind schon mal blöd.

    Dann musst du bei sowas immer aufpassen, das das referenzierte Objekt auch länger lebt, als die zurückgebende Funktion etc.



  • string **&**rs;
    Danke, genau das habe ich gesucht! 👍


Anmelden zum Antworten