Rückgabe per Referenz - Sinn und Zweck?



  • Hallo alle zusammen

    Sollte ich einen Beitrag welcher dieses Thema bereits erklärt nicht gefunden haben entschuldige ich mich dafür.

    Ich lerne C++ und stehe zur Zeit gerade beim Thema return by reference auf dem Schlauch.
    Mir wird der Sinn der Sache nicht ganz klar.
    Gemäss meiner Suche im Internet ist diese Variante schnell und zuverlässig.
    Man muss darauf achten, nicht eine Referenz auf ein Objekt bspw. einer Funktion zurück geben zu wollen, welche nach verlassen der Funktion nicht mehr existiert.

    Ich habe schon ein paar wenige Beispiele gesehen in welchen Referenzen als Rückgabewert eingesetzt werden, Verstand jedoch nicht weshalb diese verwendet werden, da ich mittels void auf das exakt selbe Resultat gekommen bin.

    Bspw. bei Operatorüberladungen:

    class Sales {
      unsigned int paperback;
      unsigned int ebook;
    public:
      Sales(unsigned int p=0, unsigned int e=0) : paperback(p), ebook(e) {}
      Sales& operator++();
    };
    
    Sales& Sales::operator++() {
      paperback++;
      ebook++;
      return *this;
    }
    
    int main() {
      Sales book01(100, 200);
      ++book01;
    }
    

    Ich verstehe nicht wozu die Referenz als Rückgabewert dient, wenn die Werte
    ohnehin schon in der Methode geändert wurden.
    Mittels void als Rückgabetyp komme ich auf dasselbe Resultat.

    Kann mir das jemand erklären und mich erleuchten?
    Dafür wäre ich unendlich dankbar.

    Liebe Grüsse
    Inmeining


  • Mod

    Ich verstehe nicht wozu die Referenz als Rückgabewert dient, wenn die Werte ohnehin schon in der Methode geändert wurden.

    Es ist auch nicht per se nötig. Aber es gibt nun mal einige Leute, die gerne Operationen aneinanderketten, wie es bei Skalaren möglich ist. Und Klassen sollen sich ja auch mit den Operatoren wie Skalare anfühlen. E.g. für Iteratoren schreibt man manchmal

    *myObject++ = value;
    

    schreiben, das ist schon ein bekanntes Idiom.

    Edit: Bei Iteratoren ist es sowieso ein muss, da der Standard wegen ebenjener Idiome vorschreibt, dass e.g. Inkrementoperatoren von Iteratoren die Klasse entsprechend zurückgeben müssen.



  • Also ist, einfach gesagt, der Hauptgrund für die Rückgabe als Referenz die Verwendung von bzw. für Iteratoren oder das aneinanderketten von Operationen?



  • Ein anderer möglicher Grund ist, dass eine Kopie zu aufwändig wäre. In dem Fall könnte eine Klasse eine const Referenz auf ein internes Objekt zurückgeben, um schnellen Lesezurgiff zu ermöglichen.



  • Ein Rückgabewert der Methode ist notwendig, wenn während der Initialisierungsphase Objekte z.B. an einer Factory registriert werden.

    Beispiel:

    class MyFactory {
    public:
      static MyFactory& getInstance();
    
      MyFactory& reg(const std::string& key);
    }
    
    // --- irgendwo im nirgendwo
    namespace {
      void* d[] = { &MyFactory::getInstance().reg("HelloWorld") };
    }
    

    Würde reg kein Rückgabewert liefern (also void) gäbe es an der Stelle ein Compilerfehler.



  • Referenzen sind die vornehme Art der C-Zeiger in C++. Man findet hierbei nur keine Adresse des "Zeigers". 😉


Log in to reply