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.

114 6. Po<strong>in</strong>ter und References<br />

gestattet, wenn sich aus der äußeren Sicht am Inhalt e<strong>in</strong>es als const<br />

deklarierten Objekts nichts verändert!<br />

E<strong>in</strong>e typische Anwendung für e<strong>in</strong>e versteckte Veränderung, die “außenstehende”<br />

Entwickler nicht bemerken, ist z.B. das Cach<strong>in</strong>g von Daten h<strong>in</strong>ter<br />

den Kulissen. Je nachdem, was man genau bezwecken will, gibt es auch noch<br />

die alternative Möglichkeit, e<strong>in</strong>zelne Variablen als mutable zu deklarieren.<br />

Dies wird <strong>in</strong> Abschnitt 15.1 noch genauer behandelt.<br />

Vorsicht Falle: Wo auch immer sich aufgrund der Semantik e<strong>in</strong>er Funktion<br />

an e<strong>in</strong>em Parameter nach außen h<strong>in</strong> nichts ändern soll, aber aus technischen<br />

Gründen die Verwendung e<strong>in</strong>er Reference wünschenswert oder notwendig ist<br />

(z.B. bei e<strong>in</strong>er Structure als Parameter), soll man diesen Parameter immer als<br />

const deklarieren. Damit signalisiert man nach außen, dass man nicht beabsichtigt,<br />

etwas zu verändern. Deklariert man e<strong>in</strong>en solchen Parameter nicht<br />

als const, so werden sich alle Entwickler, die diese Funktion verwenden, auf<br />

e<strong>in</strong>e mögliche Änderung e<strong>in</strong>stellen und auf diese Art unnötig komplizierten<br />

Code erzeugen.<br />

Es gibt den noch schlimmeren Fall, dass man e<strong>in</strong>e Funktion, die e<strong>in</strong>en Parameter<br />

irrtümlich nicht als const deklariert hat, gar nicht verwenden kann,<br />

weil man selbst nur e<strong>in</strong>e const Reference <strong>in</strong> Händen hält. Das Schlimmste,<br />

was dann herauskommen kann, ist die notgedrungene Verwendung e<strong>in</strong>es<br />

const_cast, um den Aufruf überhaupt tätigen zu können. Haben allerd<strong>in</strong>gs<br />

e<strong>in</strong>mal solche bösen Hacks <strong>in</strong> den Code E<strong>in</strong>gang gefunden, dann bahnen sich<br />

viele unabwendbare Katastrophen an, denn wer soll sich noch auskennen,<br />

welches const ernst geme<strong>in</strong>t ist und welches nicht?<br />

6.2 Po<strong>in</strong>ter<br />

Nach der Diskussion über References s<strong>in</strong>d wir nun endgültig bei der Hardcore<br />

Variante des Hantierens mit Adressen angekommen, nämlich bei den Po<strong>in</strong>tern.<br />

Po<strong>in</strong>ter s<strong>in</strong>d im Pr<strong>in</strong>zip etwas unheimlich E<strong>in</strong>faches: Es s<strong>in</strong>d Variablen,<br />

deren Inhalt e<strong>in</strong>e Adresse ist. Genau diese E<strong>in</strong>fachheit macht sie auch so<br />

mächtig, man kann nämlich damit auf quasi beliebige Inhalte im Speicher<br />

zeigen. Diese Inhalte können verschiedenster Natur se<strong>in</strong>, nämlich sowohl<br />

Speicherstellen für Daten als auch E<strong>in</strong>sprungadressen von Funktionen bzw.<br />

Methoden. Natürlich kann man mit Adressen auch beliebig rechnen und auf<br />

diese Art Blöcke verwalten.<br />

Dieselbe E<strong>in</strong>fachheit, die Po<strong>in</strong>ter so mächtig macht, macht sie gleichzeitig<br />

auch so gefährlich <strong>in</strong> den Händen ungeübter und/oder unvorsichtiger Entwickler.<br />

Wie bereits bei den Datentypen diskutiert wurde, ist <strong>in</strong>tern <strong>in</strong> e<strong>in</strong>em<br />

Computer praktisch alles e<strong>in</strong>fach nur Interpretationssache. Im Fall von<br />

Po<strong>in</strong>tern wird die Interpretation dessen, worauf die Adresse zeigt, noch bei

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!