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.

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

85<br />

86 return ( 0 ) ;<br />

87 }<br />

Zeile 84 jedoch, die e<strong>in</strong>en expliziten Konstruktoraufruf enthält, funktioniert<br />

wie geplant. Es sollte also beim Deklarieren von Konstruktoren für e<strong>in</strong>e Klasse<br />

bei allen Lesern immer daran gedacht werden, unter welchen Umständen<br />

der Compiler für e<strong>in</strong> Objekt e<strong>in</strong>en impliziten Konstruktoraufruf e<strong>in</strong>setzt:<br />

• Bei Verwendung von = zur Initialisierung mit e<strong>in</strong>em Wert wird e<strong>in</strong> passender<br />

Konstruktor gesucht.<br />

• Bei Übergabe als Parameter an e<strong>in</strong>e Methode oder Funktion aufgrund des<br />

call-by-value Mechanismus wird der Copy Konstruktor aufgerufen.<br />

• Bei Verwendung <strong>in</strong> e<strong>in</strong>em return Statement wird der Copy Konstruktor<br />

aufgerufen, denn auch der return-Value wird ja by-value geliefert.<br />

• Bei Verwendung als Exception wird der Copy Konstruktor aufgerufen (dazu<br />

kommen wir noch <strong>in</strong> Kapitel 11).<br />

Sollte <strong>in</strong> irgende<strong>in</strong>em dieser Fälle der implizite Aufruf gefährlich se<strong>in</strong>, so muss<br />

e<strong>in</strong> Konstruktor als explicit deklariert werden.<br />

9.2.5 Object- und Class-Members<br />

In Abschnitt 8.3 wurde bereits erwähnt, dass es auch sogenannte Class-<br />

Members gibt. Dies s<strong>in</strong>d solche Members, die allen Instanzen e<strong>in</strong>er Klasse<br />

geme<strong>in</strong>sam s<strong>in</strong>d, anstatt für jedes Objekt extra zu existieren. Solche Members<br />

(Variablen oder auch Methoden) deklariert man dadurch, dass man sie<br />

static setzt, wie folgende kle<strong>in</strong>e Veränderung unserer Kartenklasse für das<br />

Memory Spiel zeigt. Diese protokolliert selbsttätig mit, wie viele Karten<br />

eigentlich im Programm <strong>in</strong>sgesamt existieren (memory_game_card_v2.h):<br />

1 // memory game card v2 . h − extension o f c l a s s MemoryGameCard<br />

2<br />

3 #ifndef memory game card v2 h<br />

4 #def<strong>in</strong>e memory game card v2 h<br />

5<br />

6 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

7 /∗<br />

8 ∗ MemoryGameCard<br />

9 ∗<br />

10 ∗ model of a card as used <strong>in</strong> the game ”memory”<br />

11 ∗<br />

12 ∗/<br />

13<br />

14 class MemoryGameCard<br />

15 {<br />

16 protected :<br />

17 static unsigned num <strong>in</strong>stances ;<br />

18 char ∗ symbol ;<br />

19 public :<br />

20 MemoryGameCard( const char ∗ symbol ) ;<br />

21 ˜MemoryGameCard ( ) ;

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!