30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

336 12. Operator Overload<strong>in</strong>g<br />

• Positives und negatives Vorzeichen sollen im Zusammenhang mit Vektoren<br />

verwendet werden können.<br />

• E<strong>in</strong> Vektor soll mit e<strong>in</strong>em Skalar (also bei uns mit e<strong>in</strong>em double Wert)<br />

multiplizierbar se<strong>in</strong>. Dabei soll mathematisch korrekt jedes E<strong>in</strong>zelelement<br />

des Vektors mit dem Skalar multipliziert werden.<br />

• Die Zuweisung e<strong>in</strong>es Vektors auf e<strong>in</strong>en anderen mittels = Operator soll<br />

möglich se<strong>in</strong>.<br />

• Für Addition, Subtraktion und Multiplikation soll es auch die Zuweisungs-<br />

Kurzformen +=, -= und *= geben.<br />

• Der Vergleich zweier Vektoren auf Gleichheit sowie auf Ungleichheit soll<br />

<strong>in</strong>tuitiverweise mittels == bzw. != möglich se<strong>in</strong>.<br />

Im Pr<strong>in</strong>zip stellt sich also hier nur die Frage, wie man <strong>in</strong> C ++ dem Compiler<br />

erklärt, was e<strong>in</strong> Operator zu tun hat. Denkt man e<strong>in</strong> wenig näher über<br />

die Eigenschaften von Operatoren nach, so lässt sich leicht erkennen, dass<br />

sie eigentlich auch nichts anderes als Methoden bzw. Funktionen se<strong>in</strong> müssten.<br />

Und bis auf die spezielle Syntax, die Operatoren zugrunde liegt, ist das<br />

auch so. Nehmen wir z.B. e<strong>in</strong>mal den folgenden Ausdruck her, bei dem wir<br />

annehmen, dass beide Variablen vom selben Typ MathVector s<strong>in</strong>d:<br />

vector1 + vector2<br />

Das bedeutet für den Compiler salopp gesprochen: Ich habe e<strong>in</strong>en b<strong>in</strong>ären<br />

Plus-Operator, der als se<strong>in</strong>e Operanden jeweils etwas vom Typ MathVector<br />

oder etwas Kompatibles nimmt.<br />

Oder nehmen wir folgenden Ausdruck unter denselben Typ-Voraussetzungen:<br />

-vector1<br />

Das bedeutet für den Compiler salopp gesprochen: Ich habe e<strong>in</strong>en unären<br />

M<strong>in</strong>us-Operator, der als Operanden etwas vom Typ MathVector oder etwas<br />

Kompatibles nimmt.<br />

Solche Betrachtungen des Compilers gelten natürlich für alle Operatoren,<br />

die <strong>in</strong> C ++ def<strong>in</strong>iert s<strong>in</strong>d, also auch Index- und Typumwandlungs-Operatoren<br />

und z.B. sogar für die Operatoren new und delete.<br />

Der Operator ist <strong>in</strong> allen Fällen für den Compiler irgendetwas Aufrufbares,<br />

das die Aufgabe schon erledigen wird, also ausführbarer Code, der die<br />

Implementation des Operators repräsentiert.<br />

Wenn wir nun noch weiter <strong>in</strong> Betracht ziehen, dass der Compiler Ausdrücke<br />

von l<strong>in</strong>ks nach rechts auswertet, dann kann man auch e<strong>in</strong>en s<strong>in</strong>nvollen<br />

Platz def<strong>in</strong>ieren, an dem der Compiler diese Def<strong>in</strong>ition sucht:<br />

• Bei b<strong>in</strong>ären Operatoren <strong>in</strong> der Deklaration der Klasse, der der l<strong>in</strong>ke Operand<br />

angehört.<br />

• Bei unären Operatoren <strong>in</strong> der Klasse, der der (e<strong>in</strong>zige) Operand angehört.<br />

Bei e<strong>in</strong>em unären M<strong>in</strong>us also ist dies der Operand rechts neben dem M<strong>in</strong>us,<br />

beim Index Operator ist es der Operand l<strong>in</strong>ks davon.<br />

Allgeme<strong>in</strong> gesprochen sucht der Compiler immer <strong>in</strong> der Klasse des Operanden<br />

nach der Operator-Def<strong>in</strong>ition, auf die sich der Operator bezieht. Im Falle,

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!