Kurze Frage zu Operatorüberladung



  • Ich habe 2 Versionen gesehen, den + Operator zu überladen:

    Klasse operator+(const int&) const;
    
    Klasse operator+(const Klasse&, const int&);
    

    Sind beide Versionen gleichwertig oder gibt es da irgendwelche Unterschiede?



  • Es gibt Unterschiede:

    Die erste Version ist der Klassen-eigene + Operator (d.h. Memberfunktion), die zweite Version ist ein (für diese Klasse) überladener globaler + Operator (d.h. freie Funktion).

    Für binäre Operatoren wird die zweite Variante empfohlen, da du über eine weitere Überladung eine veränderte Reihenfolge der Parameter erlauben kannst, also Klasse+x sowie x+Klasse.

    Die erste Version lässt dies nicht zu, hier muss immer ein Objekt der Klasse links stehen.



  • Wie ist denn die "normale" vorgehensweise, wenn ich die Objekt meiner Klasse kompatibel mit anderen Objekten machen möchte?

    Im Moment löse ich das so

    class Klasse
    {
       private:
        int a;
    
       public:
        Klasse operator+(const Klasse&) const;
        template<typename T> Klasse operator+(const T&) const;
        template<typename T> friend Klasse operator + (const T&, const Klasse&);
    };
    
    Klasse Klasse::operator+(const Klasse&) const
    {
       //...
    }
    
    template<typename T> Klasse Klasse::operator+(const T&) const
    {
       //...
    }
    
    template<typename T> Klasse operator + (const T&, const Klasse&)
    {
       //....
    }
    

    Ist das (vom Prinzip her) der richtige Stil?


  • Administrator

    Meistens macht man es so:

    class MyClass
    {
      // ...
    public:
      MyClass& operator +=(MyClass const& rhs);
    
      template<typename ValueT>
      MyClass& operator +=(ValueT const& val);
    
      // ...
    };
    
    MyClass& MyClass::operator +=(MyClass const& rhs)
    {
      // ...
    }
    
    template<typename ValueT>
    MyClass& MyClass::operator +=(ValueT const& val)
    {
      // ...
    }
    
    MyClass operator +(MyClass const& lhs, MyClass const& rhs)
    {
      MyClass copy(lhs);
      copy += rhs;
      return copy;
    }
    
    template<typename ValueT>
    MyClass operator +(MyClass const& lhs, ValueT const& rhs)
    {
      MyClass copy(lhs);
      copy += rhs;
      return copy;
    }
    
    // usw.
    

    Also Zuweisungen in die Klasse rein, die Operatoren aus der Klasse raus und dann meistens über die Zuweisung realisieren.

    Grüssli



  • *hust*

    Ich darf auf den enstprechenden Artikel zur Operatorüberladung im Magazin verweisen *fg*

    http://magazin.c-plusplus.net



  • Fein gemacht Pumukl, aber das *hust war nicht angebracht, zurück ins Körbchen...


  • Administrator

    pumuckl schrieb:

    *hust*

    Ich darf auf den enstprechenden Artikel zur Operatorüberladung im Magazin verweisen *fg*

    http://magazin.c-plusplus.net

    Hmmm, stimmt, da hat ja so ein seltsamer Typ vor kurzem einen ziemlich guten Artikel geschrieben. Ganz vergessen 🙂

    Grüssli


Anmelden zum Antworten