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.

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

erzeugen, das ja nur temporär ist und danach sowieso wieder weggeworfen<br />

wird? Das unäre Plus bewirkt ja überhaupt ke<strong>in</strong>e Änderung am Inhalt des<br />

Vektors. Also kann die Implementation gleich e<strong>in</strong>e Referenz auf sich selbst<br />

liefern um unnötiges Erzeugen und wieder Wegwerfen zu verh<strong>in</strong>dern. Das<br />

Statement<br />

+vector1<br />

wird also vom Compiler der Behandlung durch diesen Operator zugeführt.<br />

• In den Zeilen 57–58 f<strong>in</strong>det sich der Additions-Kurzzuweisungs-Operator.<br />

E<strong>in</strong>e Anwendung dieses Operators bewirkt natürlich e<strong>in</strong>e Veränderung des<br />

Inhalts des Objekts. Deshalb kann auch gleich e<strong>in</strong>e Referenz auf das<br />

geänderte Objekt als return-Wert geliefert werden. F<strong>in</strong>det der Compiler<br />

also irgendwo im Code das Statement<br />

vector1 += vector2;<br />

dann wird dieser Operator auf vector1 mit vector2 als Parameter aufgerufen.<br />

Lesern, die sich nun fragen, warum dieser Operator überhaupt<br />

e<strong>in</strong>en return-Wert liefert, möchte ich folgendes Beispiel zeigen, das absolut<br />

regulär ist:<br />

vector3 = vector1 += vector2;<br />

Hier wird zuerst e<strong>in</strong>e Additions-Kurzzuweisung von vector2 auf vector1<br />

gemacht und das Ergebnis dieser Operation wird dann vector3 zugewiesen<br />

(siehe auch Zuweisungs-Operator weiter unten). Wäre der Operator als<br />

void Operator def<strong>in</strong>iert (was theoretisch möglich ist), dann wäre e<strong>in</strong> solches<br />

Statement hierdurch mit Erfolg verh<strong>in</strong>dert worden und der Compiler würde<br />

sich beschweren.<br />

• In den Zeilen 60–67 f<strong>in</strong>den sich die verschiedenen M<strong>in</strong>us-Operatoren. Diese<br />

funktionieren analog zu den soeben besprochenen Plus-Operatoren, allerd<strong>in</strong>gs<br />

mit e<strong>in</strong>er Ausnahme: Das unäre M<strong>in</strong>us liefert als return-Wert ke<strong>in</strong>e<br />

Referenz, sondern e<strong>in</strong> Objekt. Muss es auch, denn hier wird ja der entsprechende<br />

negative Vektor erwartet, allerd<strong>in</strong>gs ohne das Orig<strong>in</strong>al zu ändern.<br />

• In den Zeilen 69–73 s<strong>in</strong>d die entsprechenden Multiplikations-Operatoren<br />

deklariert. Ich denke, zu diesen kann ich mir die Erklärung jetzt auch<br />

ersparen, denn sie funktionieren praktisch analog zu den Additions- und<br />

Subtraktionsoperatoren. Nur nehmen sie als zweites Argument eben ke<strong>in</strong>en<br />

MathVector, sondern e<strong>in</strong>en double Wert. Wer Lust hat, kann ja auch die<br />

Multiplikation von zwei Vektoren (also das sog. Kreuzprodukt) implementieren.<br />

Dies geschieht durch e<strong>in</strong> e<strong>in</strong>faches Overload<strong>in</strong>g des entsprechenden<br />

Multiplikations-Operators durch e<strong>in</strong>en, der als Parameter e<strong>in</strong> Element vom<br />

Typ MathVector nimmt.<br />

• In den Zeilen 75–76 ist der Zuweisungs-Operator def<strong>in</strong>iert. Wie dieser<br />

funktioniert, lässt sich leicht vorstellen. Dass auch dieser Operator e<strong>in</strong>en<br />

return-Wert liefert ist ebenso logisch, denn Statements wie<br />

vector1 = vector2 = vector3;<br />

sollen natürlich auch unterstützt werden.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!