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.

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

12 6<br />

13 ∗∗∗∗ RangeControlledInt : conversion to <strong>in</strong>t32<br />

14 RangeControlledInt : = with <strong>in</strong>t32<br />

15 Oops − caught r a n g e e r r o r : value out o f range<br />

Aufmerksame Leser haben sicherlich bereits erkannt, dass die Deklaration des<br />

Typumwandlungs-Operators <strong>in</strong> Zeile 46 zu f<strong>in</strong>den ist. Allerd<strong>in</strong>gs liest sich dieser<br />

Operator doch etwas komisch, wenn man ihn mit den anderen Operatoren<br />

vergleicht. Der Name des Operators ist <strong>in</strong>t32 und das Fehlen von Parametern<br />

zwischen den Klammern sagt uns, dass er e<strong>in</strong> unärer Operator ist. Allerd<strong>in</strong>gs<br />

ist im Gegensatz zu anderen Operatoren ke<strong>in</strong> expliziter return-Value<br />

angegeben! Wenn man kurz nachdenkt, wird auch klar warum: Was soll e<strong>in</strong>e<br />

Umwandlung auf e<strong>in</strong>en <strong>in</strong>t32 denn auch anderes liefern als e<strong>in</strong>en <strong>in</strong>t32? Def<strong>in</strong>iert<br />

man also e<strong>in</strong>en Typumwandlungs-Operator, so schreibt man e<strong>in</strong>fach<br />

das Keyword operator, gefolgt vom Datentyp, <strong>in</strong> den man umwandeln will,<br />

gefolgt von öffnender und schließender runder Klammer, das war’s. Dass sich<br />

h<strong>in</strong>ter der Syntax mit dem fehlenden return-Value e<strong>in</strong>e Erleichterung für die<br />

Compilerbauer versteckt, ist e<strong>in</strong>e andere Geschichte :-).<br />

Die Implementation des Typumwandlungs-Operators <strong>in</strong> den Zeilen 113–<br />

117 braucht sicherlich ke<strong>in</strong>e nähere Erklärung. Um genau verfolgen zu<br />

können, was h<strong>in</strong>ter den Kulissen passiert, wurde <strong>in</strong> gewohnter Weise <strong>in</strong> alle<br />

Methoden e<strong>in</strong> entsprechender Output e<strong>in</strong>gebaut. Werfen wir also nun e<strong>in</strong>en<br />

Blick auf denselben:<br />

Die Zeilen 1–2 des Outputs werden beim Anlegen der entsprechenden<br />

Variablen <strong>in</strong> den Zeilen 126–127 des Programms erzeugt. Dass die Zeilen<br />

3–4 des Outputs ihren Ursprung <strong>in</strong> den Zuweisungen aus den Zeilen 129–<br />

130 des Programms haben, ist auch nicht weiter verwunderlich. Zeile 131<br />

des Programms wird <strong>in</strong> dieser Beziehung schon <strong>in</strong>teressanter, denn von ihr<br />

rühren die Zeilen 5–6 des Outputs her, die zeigen, dass hier zum ersten<br />

Mal unser Typumwandlungs-Operator <strong>in</strong>s Spiel kommt: Hier wird zuerst<br />

controlled_var2 <strong>in</strong> e<strong>in</strong>en <strong>in</strong>t32 verwandelt, danach wird die Subtraktion<br />

durchgeführt und das Ergebnis wird dann entsprechend zugewiesen. Man<br />

sieht also, dass der Compiler aus dem Subtraktionsoperator und dem l<strong>in</strong>ks<br />

von ihm stehenden <strong>in</strong>t32 den Schluss gezogen hat, dass rechts wohl auch<br />

e<strong>in</strong> <strong>in</strong>t32 stehen sollte, damit die Operation ordnungsgemäß ausgeführt<br />

werden kann. In unserer Klassendeklaration hat er den entsprechenden<br />

Typumwandlungs-Operator gefunden und automatisch e<strong>in</strong>gesetzt.<br />

Dass dies nicht nur funktioniert, wenn l<strong>in</strong>ks des Operators e<strong>in</strong> <strong>in</strong>t32<br />

steht, sondern auch umgekehrt und sogar <strong>in</strong> beliebiger Komb<strong>in</strong>ation, beweisen<br />

die Zeilen 132–133 des Programms, die im Output die Zeilen 7–10<br />

erzeugen. Salopp gesagt arbeitet der Compiler also so, dass er zuerst e<strong>in</strong>en<br />

Ausdruck daraufh<strong>in</strong> analysiert, was denn s<strong>in</strong>nvolle Komb<strong>in</strong>ationen von Datentypen<br />

wären, um die gewünschten Operationen auszuführen. F<strong>in</strong>det er<br />

dann entsprechende Typumwandlungen, so werden diese e<strong>in</strong>gesetzt und alles<br />

geht se<strong>in</strong>en erwarteten Weg.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!