30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

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

Interessant ist jetzt nur, was hier <strong>in</strong>tern passiert. Es ist nämlich -> e<strong>in</strong> unärer<br />

Operator, wie <strong>in</strong> Zeile 58 zu erkennen ist. Dieser Operator liefert allerd<strong>in</strong>gs<br />

wirklich e<strong>in</strong>en Po<strong>in</strong>ter auf das gewünschte Objekt. So weit, so gut, bloß damit<br />

ist doch eigentlich -> bereits abgearbeitet, also quasi “aufgebraucht”. Wieso<br />

kommt es dann tatsächlich zu e<strong>in</strong>em Aufruf von getValue? Das liegt daran,<br />

dass C ++ diesen Operator zweistufig behandelt:<br />

1. Zuerst wird unser def<strong>in</strong>ierter Operator aufgerufen.<br />

2. Auf dem return-Value wird dann der “echte” Memberzugriff gemäß -><br />

durchgeführt.<br />

Der Ausdruck obj_ptr->getValue() wird also vom Compiler so behandelt,<br />

als ob hier<br />

(obj_ptr.operator->())->getValue()<br />

stünde. Dieses Verhalten ist auch das e<strong>in</strong>zig s<strong>in</strong>nvolle, denn ansonsten würde<br />

e<strong>in</strong> Overload<strong>in</strong>g ke<strong>in</strong>en Wert haben. E<strong>in</strong> Objekt kann nur durch diese Behandlung<br />

des Operators nach außen h<strong>in</strong> so tun, als ob es e<strong>in</strong> Po<strong>in</strong>ter auf e<strong>in</strong><br />

anderes Objekt wäre.<br />

Vorsicht Falle: Drei Operatoren gibt es, bei denen ich allen Lesern den<br />

guten Tipp geben möchte, die F<strong>in</strong>ger von e<strong>in</strong>em Overload<strong>in</strong>g zu lassen, außer<br />

es geht gar nicht anders. Dies ist e<strong>in</strong>erseits der , (=Komma) Operator,<br />

andererseits && und ||. Das Problem dabei ist, dass hier nicht mehr gesagt<br />

ist, ob standardmäßig e<strong>in</strong>e short Evaluation des Ausdrucks stattf<strong>in</strong>det. Der<br />

Compiler kann sehr wohl entscheiden, dass hier auf jeden Fall den selbstgebastelten<br />

Operator aufruft, weil er diesem ja nicht <strong>in</strong>s Handwerk pfuschen<br />

will. Das kann alle möglichen Probleme, vom e<strong>in</strong>fachen Performancemord<br />

bis h<strong>in</strong> zur Segmentation Violation <strong>in</strong> gewissen Situationen nach sich ziehen.<br />

Sollte man also wirklich diese Operatoren selbst def<strong>in</strong>ieren wollen, so muss<br />

man auf allen verwendeten Plattformen testen, welche Art der Evaluierung<br />

vom Compiler herangezogen wird und entsprechend darauf reagieren.<br />

Vorsicht Falle: Neben den bereits erwähnten Fallen gibt es noch e<strong>in</strong>e ganz<br />

besondere, <strong>in</strong> die vor allem Neul<strong>in</strong>ge tappen, wenn sie beg<strong>in</strong>nen, sich beim<br />

Operator Overload<strong>in</strong>g wohl zu fühlen: Die übertriebene und damit oft nicht<br />

mehr <strong>in</strong>tuitive Anwendung des Operator Overload<strong>in</strong>gs!<br />

Operatoren s<strong>in</strong>d nur dann e<strong>in</strong>e Hilfe für Entwickler, wenn sie <strong>in</strong>tuitiv s<strong>in</strong>d.<br />

Zum Beispiel ist e<strong>in</strong> + Operator vollkommen <strong>in</strong>tuitiv, wenn er zur Addition<br />

von z.B. Vektoren oder Matrizen def<strong>in</strong>iert ist. Auch zum ane<strong>in</strong>ander Reihen<br />

von Str<strong>in</strong>gs (=concatenation) ist dessen E<strong>in</strong>satz noch s<strong>in</strong>nvoll. Gar nicht<br />

mehr <strong>in</strong>tuitiv ist dieser Operator, wenn er z.B. für e<strong>in</strong> Objekt Auto als Gas<br />

geben def<strong>in</strong>iert wird und vielleicht auch dann noch der Operator - als bremsen<br />

dazukommt. Klar wird man nach Lektüre der Dokumentation wissen, dass<br />

diese Operatoren so verwendet werden, aber trotzdem ist <strong>in</strong> diesem Fall die<br />

Implementation über Methoden bei weitem <strong>in</strong>tuitiver und leichter lesbar.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!