Frage: Methode Rückgabewert als Referenz oder Pointer??



  • Folgende Konstellation:

    class dummy{
    
     Foo[2];
    
      Foo& Get(i);
      //oder
      Foo* Get(i);
    };
    
    Foo* Get(int i){
    
      return &(Foo[i]);
    
    }
    //oder
    Foo& Get(int i){
    
      return Foo[i]
    }
    

    wenn ich nun irgendwo im Code aurufe:

    Foo o= Get(0);
    o.xxx...
    o= Get(1);
    o.xxx...
    

    ist das dann equvalent zu:

    Foo *p= Get(0);
    p->xxx...
    p= Get(1);
    p->xxx...
    


  • Ich würde nur dann Zeiger verwenden, wenn ich auch vorhabe, NULL-Werte zurückzugeben. Ansonsten nimm lieber Referenzen.

    PS: Übrigens kannst du auch d.Get(0).xxx... schreiben, um direkt auf die zurückgegebenen Array-Elemente zuzugreifen 😉



  • CStoll schrieb:

    PS: Übrigens kannst du auch d.Get(0).xxx... schreiben, um direkt auf die zurückgegebenen Array-Elemente zuzugreifen 😉

    Ja, macht der COde ja aber gerade *nicht*. 'Foo o = Get(0)' legt eine Kopie an.



  • Wollte ich auch gerade einwenden. Demnach ist natürlich erst folgendes "equvalent":

    Foo *p= Get(0);
    p->xxx... // äquivalent zu
    
    Foo& o = Get(0);
    o.xxx...
    
    // Und folgendes ist nicht möglich, daher auch nicht äquivalent zu irgendwas
    o = Get(1);
    


  • was passiert wenn ich dies machen mit "o"? :

    Foo& o = Get(0);
    o.xxx...
    
    // Und folgendes ist nicht möglich, daher auch nicht äquivalent zu irgendwas
    o = Get(1);
    

    wir hier nich die o referenz überschrieben?



  • Nein, hier wird der operator= von dem Objekt, auf das o verweist (also Element 0) mit dem Objekt rechts vom = als Argument (also Element 1) aufgerufen. Du würdest also Element 1 auf Element 0 kopieren. Um das nochmal "equvalent" darzustellen:

    Foo& o = Get(0);
    o.xxx...
    o = Get(1); // ist äquivalent zu
    o.operator=(Get(1)); // folglich äquivalent zu
    Get(0) = Get(1);
    


  • Foo& o = Get(0);
    o.xxx...;
    

    o ist eine Referenz auf das erste Array-Element - und die Auswirkungen von xxx machen sich damit auf das Element bemerkbar.

    o = Get(1);
    

    Im Gegensatz zu deiner Zeiger-Lösung verbiegt das nicht die Referenz (Referenzen verweisen während ihrer kompletten Lebensdauer auf das selbe Objekt), sondern weist dem Objekt hinter o den Inhalt von Get(1) zu - d.h. du überschriebst das erste Array-Element mit dem Inhalt des zweiten.



  • ok perfekt.. genau das hat mich dieganze zeit verwirrt;) Danke .. habs verstanden..;) 🙂


Anmelden zum Antworten