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.

184 9. Klassen <strong>in</strong> <strong>C++</strong><br />

man also e<strong>in</strong>en Member, der dynamisch allokierten Speicher hält, so wird<br />

dieser nicht automatisch freigegeben.<br />

Es wird garantiert, dass der Destruktor aufgerufen wird, solange für das<br />

Objekt noch vollständig Speicher reserviert ist. Das Freigeben des Speichers<br />

erfolgt erst danach. Damit kann man auf jeden Fall <strong>in</strong>nerhalb des Destruktors<br />

gefahrlos auf alle Members des Objekts zugreifen.<br />

Vorsicht Falle: Es wird als guter Programmierstil angesehen, jeder Klasse<br />

auf jeden Fall e<strong>in</strong>en Destruktor zu spendieren, auch wenn dieser im schlimmsten<br />

Fall leer ist. Durch e<strong>in</strong>en leeren Destruktor hat man zum<strong>in</strong>dest offiziell<br />

festgelegt, dass nichts Besonderes zu tun ist. Vergisst man z.B. das explizite<br />

Aufräumen von dynamisch allokiertem Speicher, dann bekommt man<br />

e<strong>in</strong> wachsendes Programm, was wiederum für e<strong>in</strong>ige schlaflose Nächte der<br />

Entwickler sorgt. Wenn man sich angewöhnt, immer e<strong>in</strong>en Destruktor zu<br />

deklarieren und def<strong>in</strong>ieren, dann er<strong>in</strong>nert e<strong>in</strong>en e<strong>in</strong> solcher bei e<strong>in</strong>er späteren<br />

Änderung des Klassencodes (z.B. E<strong>in</strong>führen e<strong>in</strong>er neuen dynamischen<br />

Variable) sofort beim Ansehen der Klassendeklaration daran, dass hier noch<br />

etwas zu tun wäre. Somit ist die Gefahr des Vergessens auf jeden Fall etwas<br />

ger<strong>in</strong>ger :-).<br />

Nur für Leser, die diese Falle im Zuge des Nachschlagens lesen, e<strong>in</strong> kurzer<br />

Vorgriff (alle anderen können diesen H<strong>in</strong>weis übergehen): Wir werden<br />

<strong>in</strong> späterer Folge noch e<strong>in</strong>e besondere Eigenschaft des Destruktors kennen<br />

lernen, nämlich, dass dieser unbed<strong>in</strong>gt virtual se<strong>in</strong> muss. Auch dies ist <strong>in</strong><br />

jedem Fall zu beachten, denn die re<strong>in</strong>e Existenz e<strong>in</strong>es Destruktors garantiert<br />

noch ke<strong>in</strong> vollständig korrektes und funktionsfähiges Programm!<br />

Der Vollständigkeit halber möchte ich hier noch erwähnen, dass man sowohl<br />

Konstruktor als auch Destruktor nicht unbed<strong>in</strong>gt public machen muss,<br />

sondern dass man sehr wohl auch andere Access Specifiers für diese verwenden<br />

kann. Wir werden später noch im Zuge von Beispielen mehrere sehr<br />

s<strong>in</strong>nvolle Anwendungen dafür kennen lernen. Derzeit allerd<strong>in</strong>gs würde e<strong>in</strong>e<br />

Diskussion darüber den Rahmen sprengen.<br />

9.2.2 Der Copy Konstruktor<br />

Um die Sonderstellung des sogenannten Copy Konstruktors zu erkennen, sehen<br />

wir uns e<strong>in</strong>mal folgenden Code an: (implicit_copy_constr_demo.cpp):<br />

1 // implicit copy constr demo . cpp − demo f o r an i m p l i c i t copy<br />

2 // constructor<br />

3<br />

4 #<strong>in</strong>clude <br />

5 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

6<br />

7 us<strong>in</strong>g std : : cout ;<br />

8 us<strong>in</strong>g std : : endl ;<br />

9<br />

10 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!