Rueckgabewert von operator=



  • Hallo zusamms,

    beim überladen des "=" operators einer Klasse "myClass" habe ich mich gefragt, wie der Rückgabewert dieses Operators sein sollte.
    Prinzipiell habe ich ja die Möglichkeit (da ich ja = Operatoren verketten möchte)
    die Rückgabewerte als Klasse oder als Referenz zurück zu geben, das jeweils allersings als const, oder nicht als const.
    An verschiedenen Stellen habe ich gesehen, das der = operator 2x mit der gleichen Funktionalität ueberladen wurde, einmal als
    myClass &operator= (const myClass);
    und einmal als
    const myClass operator= (const myClass);

    Ist das wirklich notwendig, und wann wird welcher operator genommen?
    danke im Voraus,
    J.



  • Ich würde als const Referenz zurückgeben lassen. Als Kopie ist zu ineffizient und wenn du nicht-const machst, ist folgendes möglich:

    (a + b) = c;     // igitt
    


  • Hallo,

    ich gebe immer eine const referenz zurück. Für mich ist es irgendwie unlogisch eine Kopie von mir zurück zugeben, da ich im nächsten Schritt als R-Value fungiere, und ich mich während der Zuweisung geändert hab evtl.. Eine normale referenz zurück zugeben find ich auch unlogisch, da ich dann verändert werden könnte, was ich von einer zweisung beim R-Value nicht erwarte.

    Ich denke da gibts formalere Ansätze. Die werden bestimmt noch gepostet.



  • ich gebe immer eine const referenz zurück. Für mich ist es irgendwie unlogisch eine Kopie von mir zurück zugeben

    Du bist auch gegen Klon-Forschung, eh? 😛



  • *GG* japp. Das klappt so schlecht im moment.

    Ich finds halt irgendwie komisch wenn ich nich "persönlich" zurück gegeben werde.
    Naja ne exakte kopie ist ja qualitativ das selbe. Dann gibts immer noch den Einwand mit der performance bei ner Kopie. 😉



  • Optimizer schrieb:

    Ich würde als const Referenz zurückgeben lassen. Als Kopie ist zu ineffizient und wenn du nicht-const machst, ist folgendes möglich:

    (a + b) = c;     // igitt
    

    Quatsch. Bei deinem Beispiel ist der Rückgabewert des Zuweisungsoperators völlig irrelevant. Damit das funktioniert, müsste lediglich der Additionsoperator eine nicht-konstante Referenz zurückgeben.



  • Klar gitb man eine Referenz zurück, eine Kopie würde etwas am Verhalten des op= von integrierten Typen ändern, oder?

    Imho soll es ja Leute geben die mit "(C=B)=A" etwas zuweisen und C soll ja am Ende gleich A sein?!

    Edit: omg, peinlicher Fehler.

    MfG SideWinder



  • Äh, aber wenn ich

    (C=B)=A
    

    zulassen möchte, darf die zurückgegebene Referenz nicht const sein, weil der operator= ja (üblicherweise) keine const Methode ist. (Abgesehen davon ,dass der Wert von B, nach C kopiert wird um dann gleich von dem Wert von A wieder überschrieben zu werden?)
    😕 😕 😕 😕



  • squark schrieb:

    Äh, aber wenn ich

    (C=B)=A
    

    zulassen möchte, darf die zurückgegebene Referenz nicht const sein, weil der operator= ja (üblicherweise) keine const Methode ist. (Abgesehen davon ,dass der Wert von B, nach C kopiert wird um dann gleich von dem Wert von A wieder überschrieben zu werden?)
    😕 😕 😕 😕

    Gib einfach ne Nichtkonstante Referenz zurück und fertig.



  • 😞 😡 🙄 😕 👎 💡 ➡ ⚠
    da hab ich ja wirklich Schwachsinn erzählt, sorry.

    Hab grad nochmal in den Scott Meyers geschaut. Ich halte zwar

    (a = b) = c
    

    auch für Schwachsinn, aber man soll sich ja an int orientieren.



  • Wie kommt man eigentlich auf die Idee eine Kopie oder const Referenz zurück zu geben???

    Bei build-in Types geht folgendes:

    a=b=c;
    

    Macht zwar wenig Sinn aber das geht und ist das gleiche wie:

    (a=b)=c;
    

    Und bewirkt das gleiche wie:

    a=c
    

    Eine Kopie oder const Referenz ist Quatsch da sonst dies nicht geht. Meiner Ansicht nach ist dann nur noch void vertretbar da der solch Konstruktion einfach ganz verbietet. Von der Performance würd ich nicht sagen, dass ein Unterschied zwischen void und T& besteht. Wahrscheinlich pack der Compiler this ja sowieso in ein Register, weil er es ja brauch um auf jeden Member zuzugreien, dann kann er auch gleich eax nehmen und dann wird der gleiche ASM code als für die Version mit void produziert.



  • op= löst von rechts nach links auf.

    Also ist
    (a=b)=c

    eben nicht das Gleiche wie
    a=b=c (ist nämlich a =(b=c)

    Es sollte bloß das selbe am Ende rauskommen 😉

    MfG SideWinder



  • #if_interestedInARookie'sOpinion
    #define _imho

    ich würde auch immer eine Referenz, dh das aktuelle im Zugriff befindliche Objekt zurückgeben
    zB

    myClass & myClass::operator=(const myClass & source){
        .......
        return * this;	
    }
    

    #endif


Anmelden zum Antworten