next up previous contents index
Next: Selbstzuweisung abtesten Up: 50 Ways to Improve Previous: Rückgabewert des = Operators

Member-Zuweisung im = Operator

   

Wenn man den Zuweisungsoperator selbst definiert, muß man an alle Datenelemente der Klasse zuweisen.

Das ist klar, aber bei abgeleiteten Klassen gar nicht so einfach:

    class base
    { int x;
      public:
      base(int i) : x(i) {}
    };
    class deriv: public base
    { int y;
      public deriv(int i): base(i), y(i) 
      {}
      deriv& operator=(const deriv& rhs);
    };

Falsch ist folgender Zuweisungsoperator für deriv:

    deriv& deriv::operator=(const deriv& rhs)
    { if (this == &rhs)
         return *this;
      y=rhs.y;
      return *this;
    }

da er die x-Komponente der Basisklasse nicht setzt.

So ist es richtig:

    deriv& deriv::operator=(const deriv& rhs)
    { if (this == &rhs)
         return *this;
      ((base&) *this) = rhs;
      y=rhs.y;
      return *this;
    }

Wichtig ist die Typumwandlung auf base&. Ohne & würde durch den Copy-Konstruktor ein temporäres Objekt vom Typ base kreiert.  

Wenn base einen eigenen = Operator hat, ist es einfacher:

    deriv& deriv::operator=(const deriv& rhs)
    { if (this == &rhs)
         return *this;
      base::operator=(rhs);
      y=rhs.y;
      return *this;
    }


next up previous contents index
Next: Selbstzuweisung abtesten Up: 50 Ways to Improve Previous: Rückgabewert des = Operators

Peter Pfahler, 1997