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.

6.1 References 113<br />

alltägliche Praxis sagen, dass das Resultat dieses bösen Hacks undef<strong>in</strong>iert<br />

ist.<br />

Ich habe diesen Hack hier vor allem deswegen demonstriert, weil ich bereits<br />

<strong>in</strong> vielen Programmen gesehen habe, dass durch e<strong>in</strong>e unvorsichtige Anwendung<br />

des const_cast solche Operationen unabsichtlich vorkommen.<br />

• E<strong>in</strong>e weitere angenehme Seite von References ist <strong>in</strong> Zeile 48 zu sehen: Führt<br />

man e<strong>in</strong>e Referenzzuweisung e<strong>in</strong>er struct durch, so ist dies natürlich deutlich<br />

effizienter, als e<strong>in</strong>e Kopie der gesamten struct zu machen, was bei<br />

e<strong>in</strong>er Wertzuweisung passieren würde. Jedoch muss man sich <strong>in</strong> diesem<br />

Fall immer dessen bewusst se<strong>in</strong>, dass jeder schreibende Zugriff auch e<strong>in</strong>e<br />

Veränderung des Orig<strong>in</strong>als hervorruft! Ist dies nicht erwünscht, so ist die<br />

Reference entsprechend als const zu deklarieren, wie dies <strong>in</strong> Zeile 51 zu<br />

sehen ist.<br />

• Zeile 54 demonstriert, dass der Compiler sehr wohl const ernst nimmt,<br />

denn er weigert sich, diese Zuweisung e<strong>in</strong>er const Structure auf e<strong>in</strong>e normale<br />

durchzuführen, obwohl h<strong>in</strong>ter der const Structure ja e<strong>in</strong>e normale<br />

steht und diese nur durch die Zuweisung zu const mutiert ist.<br />

• In den Zeilen 62–63 sieht man denselben Hack, der uns bereits zuvor begegnet<br />

ist: Hier wird bösartigerweise durch e<strong>in</strong>en const_cast der Schreibschutz<br />

von the_struct aufgehoben. Sehr, sehr selten gibt es Fälle, wo dies<br />

aus der Programmlogik heraus legitim ist. Der hier demonstrierte Fall ist<br />

e<strong>in</strong>deutig ke<strong>in</strong>er davon! Wir werden später im OO-Teil noch e<strong>in</strong>ige wenige<br />

Fälle kennen lernen, wo dieser Cast se<strong>in</strong>e Berechtigung hat.<br />

Vorsicht Falle: Auch wenn sich References bei ihrer Verwendung im Code<br />

sehr ähnlich anfühlen wie normale Variablen, so verstecken sich dah<strong>in</strong>ter<br />

doch Po<strong>in</strong>ter, die auf e<strong>in</strong>e Adresse zeigen. Damit kann man natürlich auch<br />

die entsprechenden Fehler machen, wie sie z.B. <strong>in</strong> unserem vorigen Demoprogramm<br />

gezeigt wurden. Ich kann also nur sehr nachdrücklich den Tipp<br />

geben, References vorsichtig und vorausschauend zu verwenden. Das Wichtigste<br />

bei References ist, den Mechanismus, der dah<strong>in</strong>tersteckt, genauestens<br />

verstanden zu haben, um nicht <strong>in</strong> e<strong>in</strong>e böse Falle zu tappen.<br />

Vorsicht Falle: Obwohl der const_cast erfunden wurde, um den Schreibschutz<br />

aufzuheben, der z.B. über e<strong>in</strong>e Reference mittels const verhängt wurde,<br />

verbergen sich dah<strong>in</strong>ter ungeahnte Fehlermöglichkeiten. Welcher Entwickler<br />

ist denn schon darauf gefasst, dass sich plötzlich e<strong>in</strong>e als const deklarierte<br />

Variable bzw. e<strong>in</strong> Parameter nachhaltig verändert? E<strong>in</strong> solches<br />

Verhalten führt garantiert zu vielen Nachtschichten, die mit Fehlersuche zugebracht<br />

werden, weil sich e<strong>in</strong> Programm plötzlich außerordentlich komisch<br />

verhält.<br />

Deshalb hier e<strong>in</strong>e lebensnotwendige Grundregel beim Arbeiten mit<br />

const_cast: Der E<strong>in</strong>satz von const_cast ist dann und NUR DANN

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!