OOP für Dummies: Frage zum Abschnitt über Operator-Überladung



  • Hallo,

    ich lese gerade zum Aufbessern meiner Grundlagenkenntnisse das Buch "Objektorientierte Programmierung für Dummies" von Marcus.

    In dem Kapitel über das Überladen von Operatoren steht als Beispiel für eine Überladung als Memberfunktion folgendes:

    ...
    const OpDemo1 operator+(const OpDemo1& right)
    {
       return OpDemo1(m_Value + right.getValue());
    }
    ...
    

    Kurz danach wird vor unbeabsichtigen Seiteneffekten durch Operatoren gewarnt, die angeblich in folgendem Beispiel auftreten sollen:

    const OpDemo1 operator+(const OpDemo1& right)
    {
       return m_Value + right.getValue();
    }
    

    Müsste hier nicht eigentlich genau das gleiche wie oben passieren? 😕 Ich dachte, in so einem Fall wird einfach eine implizite Konvertierung in ein OpDemo1-Objekt vorgenommen, wobei doch nichts am bestehenden Objekt geändert werden sollte, oder?

    Habe ich da etwas falsch verstanden oder ist das ein Fehler im Buch (in der Errata-Liste habe ich jedenfalls nichts dazu gefunden)?

    Sven



  • Sven25 schrieb:

    Ich dachte, in so einem Fall wird einfach eine implizite Konvertierung in ein OpDemo1-Objekt vorgenommen, wobei doch nichts am bestehenden Objekt geändert werden sollte, oder?

    Nein, das geht nicht, Du kannst ja auch nicht einfach 2 einzelne chars implizit in einen std::string umwandeln, Du konstruierst hier bewusst ein fertiges neues Objekt aus zwei anderen. 🙂



  • nman schrieb:

    Sven25 schrieb:

    Ich dachte, in so einem Fall wird einfach eine implizite Konvertierung in ein OpDemo1-Objekt vorgenommen, wobei doch nichts am bestehenden Objekt geändert werden sollte, oder?

    Nein, das geht nicht, Du kannst ja auch nicht einfach 2 einzelne chars implizit in einen std::string umwandeln, Du konstruierst hier bewusst ein fertiges neues Objekt aus zwei anderen. 🙂

    Also dass ich ein neues Objekt konstruiere, ist mir schon bewusst. "Umwandeln" war wohl zu ungenau formuliert. In dem Beispiel aus dem Buch handelt es sich bei m_Value um einen int (hätte ich vielleicht noch erwähnen sollen). Dann sollte es aber doch funktionieren, die beiden ints, nämlich m_Value und den, den getValue() zurückgibt, zu addieren und dann (im zweiten Beispiel-Code) implizit aus dem Ergebnis der Addition ein neues OpDemo1-Objekt zu erstellen (OpDemo1 hat einen Konstruktor, der einen einzelnen int als Parameter annimmt), oder?

    Das Problem wurde vorhin vielleicht noch nicht ganz deutlich: Laut dem Buch wird bei der zweiten Variante der linke Operand mitgeändert, was ich eben nicht nachvollziehen kann. Darauf bezog sich auch meine Aussage, dass nach meinem Verständnis bei der zweiten Implementierung ebenfalls nichts am bestehenden Objekt (eben dem linken Operanden) geändert werden sollte.

    Sven



  • Sorry, ich hab oben Blödsinn geschrieben, natürlich sind da nicht 2 ints aus denen Du was konstruieren möchtest sondern nur eines. 🙂

    Aber um ehrlich zu sein kenne ich das Buch nicht und dementsprechend auch die Quellcode-Listings nicht.

    edit: Ich sehe das ganze ähnlich wie Du, aber warten wir lieber auf die richtigen C++-Gurus. 😉


Anmelden zum Antworten