Operatoren überladen

C++ bietet entgegen veleier anderer Programmiersprachen die Möglichkeit, auch Operatoren wie +, -, *, / oder sogar new zu überladen, also umzudefinieren. Das kommt uns gerade recht, war doch die Vektorrechnung bisher etwas kryptisch anzusehen.

CVertex

Erzeugen wir eine schön zu verwendende 2D-Vektorenklasse:

// Typen für Koordinaten festlegen
typedef float Coord;

// Operatoren überladen
class CVertex
{
  public:

    Coord x, y;

    CVertex()
    { x = y = Coord(0); }

    CVertex(Coord initX, Coord initY)
    { x = initX; y = initY; }

    virtual ~CVertex() { }

    // zwei Vektoren addieren
    CVertex operator +(const CVertex& v) const
    { return CVertex(x + v.x, y + v.y); }

    // zwei Vektoren subtrahieren
    CVertex operator -(const CVertex& v) const
    { return CVertex(x - v.x, y - v.y); }

    // Vektor mit Skalar multiplizieren
    CVertex operator *(const Coord& s) const
    { return CVertex(x*s, y*s); }

//    friend ostream& operator<<(ostream &s, CVertex v);
};

Zuerst deklarieren wir float als Typen für unsere Koordinaten, den wir bei Bedarf z.B. in einen double umwandeln können. Wir fügen wieder einen Konstruktor hinzu, der die internen Attribute mit zwei Werten initialisiert und deklarieren dann unsere Operatoren.

Der binäre +-Operator nimmt als Eingabe z.B. zwei Vektoren und hat als Ergebnis wieder einen Vektor. Die Multiplikation des Vektors mit einer Zahl lässt sich jetzt einfach als binärer Operator mit einer Koordinate als Parameter schreiben. Zum auskommentierten friend-Schlüsselwort kommen wir noch weiter unten.

Es lassen sich auch außerhalb der Klasse Operatoren überladen, z.B. der <<-Operator zur Ausgabe eines Vektors:

// Vektor ausgeben
ostream& operator <<(ostream& stream, CVertex v)
{
    return stream << "(" << v.x << ", " << v.y << ")";
}

main

Sehen wir uns an, wie schön wir in der main-Funktion jetzt mit Vektoren umgehen können:

int main()
{
    CVertex x(1, 1);
    CVertex y(1, 2);

    // Vektor von x nach y berechnen
    CVertex z = y - x;
    // Mittelpunkt zwischen x und y berechnen
    CVertex w = (x + y) * Coord(0.5);

    cout << x << endl;
    cout << y << endl;
    cout << z << endl;
    cout << w << endl;

    return 0;

} // main()

friend

In unserer Klasse sind alle Attribute öffentlich. Hätten wir geschützte Attribute, könnten wir in der Überladung des <<-Operators gar nichts ausgeben, da wir auf diese Attribute nicht zugreifen dürften.

Um einer externen Klasse oder Methode Zugriff auf die geschützten und privaten Elemente der Klasse zu geben, existiert das friend-Schlüsselwort. Die darauf folgende Methode oder Klasse darf dann alles, was wir innerhalb der Klasse auch dürfen.

Verwendet dieses Schlüsselwort nur in seltenen Fällen und dann mit Bedacht. Information hiding: Haltet so viel geschützt wie möglich und gebt nur so viel nach außen wie nötig...

Selbständige Programmierung
  • Deklariere die Koordinaten als geschützt und versuche das Programm zu kompilieren. Kommentiere danach die Zeile mit dem friend-Schlüsselwort aus und probiere es erneut.
  • Programmiere eine Division durch einen Skalar (also eine Zahl)

zurück