Operator Überladung



  • Hallo,

    Die Zuweisungsoperatoren =, +=,-=,*= etc. soll man nur als
    Elementfunktion nicht aber als friend Funktion also extern
    deklarieren.

    Warum ist das so ?

    Danke


  • Mod

    Im Falle des normalen Zuweisungsoperators ist das durch die Sprache so vorgeschrieben, damit spätestens am Ende der Klassendefinition feststeht, ob der Compiler diesen Operator selbst deklarieren muss. Bei den anderen Operatoren, die nur als nicht-statische Member überladen werden können ([] () ->), gibt es dagegen keinen technischen Grund für diese Einschränkung, und diese ist dort nur historisch bedingt.
    Für die anderen Zuweisungsoperatoren gibt es diesbezüglich keine Einschränkungen, so dass hier die allgemeinen Regeln gelten, denen du dich bei Wahl zwischen Member- und freien Funktionen unterwerfen willst. Dazu gibt es verschiedene legitime Denkansätze.



  • Eine übliche Verwendung der arithmetischen Zuweisungsoperatoren ist die folgende:

    // += als Memberfunktion
    MyClass& MyClass::operator+= (const MyClass& Other)
    {
        // hier Membervariablen in-place verändern
        return *this;
    }
    
    // + als freie Funktion, die += verwendet. Somit schöne Kapselung.
    MyClass operator+ (const MyClass& Left, const MyClass& Right)
    {
        MyClass Temp(Left);
        Temp += Right;
        return Temp;
    }
    

    Nur so nebenbei: Hinsichtlich Compiler-Optimierungen kann es von Vorteil sein, die Kopie beim der Argumentübergabe durchzuführen. Allerdings ist dann die Schnittstelle nicht mehr ganz einheitlich und verrät unnötigerweise ein Implementierungsdetail.

    MyClass operator+ (MyClass Left, const MyClass& Right)
    {
        Left += Right;
        return Left;
    }
    

    Über die Operatorüberladung in C++ gibt es in unserem Magazin einen Artikel. Ich rate dir, diesen genau zu studieren, neben der grundlegenden Verwendung werden auch viele weiterführende Tipps gegeben (erst recht in Teil 2 und 3).


  • Mod

    Nexus, da hat sich ein Copy&Paste-Fehler in dein zweites Beispiel geschlichen, das solltest du korrigieren um die Leute nicht zu verwirren.



  • Vielen Dank für den Hinweis, ich habs geändert.


Anmelden zum Antworten