Inhalt | 6 |
Vorwort | 14 |
1 Erste Grundlagen | 16 |
1.1 Historisches | 16 |
1.2 Die Programmiersprache C++ und die Maschine | 17 |
1.3 Werkzeuge zum Programmieren | 19 |
1.3.1 Der Editor | 19 |
1.3.2 Der Compiler | 20 |
1.4 Die Beispiele | 21 |
1.5 Wo gibt es Hilfe? | 21 |
1.6 Das erste Programm! | 22 |
1.6.1 Fehlermeldungen | 25 |
1.7 Eingaben und Kommentare | 27 |
1.7.1 Kommentare und Namen | 29 |
1.8 Zahltypen und -bereiche | 30 |
1.8.1 Ganze Zahlen | 30 |
1.8.2 Kommazahlen | 34 |
1.8.3 Bit-Operatoren | 0 |
1.8.4 Vorsicht Falle: Umwandlung des Zahltyps | 36 |
1.9 Zeichen und Zeichenketten | 39 |
1.9.1 Eingabe | 42 |
1.9.2 Zeichen und Zahlen | 44 |
1.10 C++-Quiz | 45 |
2 Zahlen raten – Kontrollstrukturen anwenden | 48 |
2.1 Fallunterscheidung mit if | 48 |
2.1.1 Vergleichsoperatoren | 50 |
2.1.2 Logische Verknüpfungen | 51 |
2.1.3 Bedingungsoperator | 53 |
2.1.4 if und Fehler bei der Eingabe | 54 |
2.1.5 Fehler in Verbindung mit if | 56 |
2.1.6 C++-Quiz | 57 |
2.2 Wiederholungen | 58 |
2.2.1 while-Schleife | 58 |
2.2.2 do-while-Schleife | 60 |
2.2.3 for-Schleife | 62 |
2.2.4 Abbruch mit break | 63 |
2.2.5 Abbruch mit boolescher Variable | 64 |
2.2.6 continue – zurück an den Anfang | 64 |
2.2.7 C++-Quiz | 65 |
2.3 Der Zufall kommt ins Spiel | 67 |
2.3.1 Bereich für Zufallszahlen definieren | 70 |
2.4 Konstante | 72 |
2.5 Auswahl mit switch | 74 |
2.6 Aufzählungstyp | 77 |
2.7 C++-Quiz | 79 |
3 Ein- und Ausgabe | 80 |
3.1 Standardein- und -ausgabe | 81 |
3.1.1 Umleitung auf Betriebssystemebene | 82 |
3.2 Ein- und Ausgabe mit Dateien | 83 |
3.2.1 Schreiben einer Textdatei (Spielerdatenbank) | 83 |
3.2.2 Einlesen der Spielerdatenbank | 85 |
3.2.3 Binärdatei | 87 |
3.3 Formatierung der Ausgabe | 89 |
3.4 C++-Quiz | 90 |
4 Aufgaben strukturieren | 92 |
4.1 Deklaration und Definition | 93 |
4.1.1 Übergabe per Wert | 94 |
4.1.2 Überladen einer Funktion | 96 |
4.2 Trennung von Schnittstelle und Implementation | 97 |
4.2.1 Namensräume | 101 |
4.2.2 Präprozessoranweisungen | 102 |
4.3 Übergabe per Referenz | 103 |
4.4 Dateiübergreifende Sichtbarkeit | 105 |
4.5 Rekursion | 107 |
4.6 Einschränkung der Sichtbarkeit | 110 |
4.7 C++-Quiz | 113 |
5 Das Spielfeld | 114 |
5.1 Eine Zeile | 114 |
5.1.1 Zeilen mit array | 115 |
5.1.2 Zeilen mit vector | 117 |
5.2 Das Spielfeld – viele Zeilen | 118 |
5.2.1 Spielfeld mit vector | 120 |
5.2.2 Feld vorbesetzen | 121 |
5.3 Die Anwendung – TicTacToe | 122 |
5.4 C++-Quiz | 131 |
6 Spieler, Würfel und Klassen | 134 |
6.1 Objektorientierung | 135 |
6.2 Klasse Spieler | 137 |
6.2.1 explicit | 142 |
6.2.2 private oder public? | 143 |
6.3 Trennung von Schnittstelle und Implementation | 144 |
6.4 Mehr über Konstruktoren | 146 |
6.4.1 Allgemeiner Konstruktor | 146 |
6.4.2 Standardkonstruktor | 146 |
6.4.3 Kopierkonstruktor | 147 |
6.4.4 Einheitliche Initialisierung | 150 |
6.5 Die Zerstörung von Objekten | 151 |
6.5.1 Der Laufzeit-Stack | 151 |
6.5.2 Destruktor | 152 |
6.6 Klasse Würfel | 154 |
6.7 Würfelspiel: Mensch gegen Maschine | 156 |
6.7.1 Der Computer spielt gegen sich selbst | 157 |
6.8 C++-Quiz | 162 |
7 Grafik mit C++ | 164 |
7.1 Ereignisgesteuerte Programmierung | 165 |
7.2 Einfache Grafik | 166 |
7.3 Klassenvariablen und -funktionen | 170 |
7.4 Ereignisse | 172 |
7.5 Bewegte Grafik | 174 |
7.6 Grafikerzeugung | 182 |
7.7 C++-Quiz | 188 |
8 Dynamische Speicherbeschaffung | 190 |
8.1 Zeiger | 191 |
8.1.1 Zeiger auf Zeichen | 193 |
8.1.2 Zeigerarithmetik und Wahrheitswerte | 194 |
8.2 C-Arrays | 196 |
8.2.1 Parameterübergabe per Zeiger | 198 |
8.3 Speicherbeschaffung | 199 |
8.3.1 Die beste Art! | 199 |
8.3.2 new und delete – tun Sie es nicht! | 200 |
8.3.3 unique_ptr | 203 |
8.3.4 shared_ptr | 205 |
8.4 Grafische Objekte dynamisch erzeugen | 207 |
8.4.1 Speicherplatz besser nutzen | 209 |
8.5 Zeiger als Beobachter | 210 |
8.6 C++-Quiz | 212 |
9 Vererbung | 214 |
9.1 Generalisierung und Spezialisierung | 214 |
9.2 Vererbung am Beispiel | 215 |
9.2.1 Statische Auswertung | 221 |
9.3 Konstruktor erben | 221 |
9.4 Polymorphismus | 222 |
9.4.1 Polymorphismus und >>die großen Drei<< | 224 |
9.4.2 Überschreiben oder nicht überschreiben? | 224 |
9.4.3 Polymorphismus-Anwendung | 226 |
9.4.4 Herausfiltern bestimmter Klassen | 227 |
9.5 Abstrakte Klassen | 228 |
9.6 Mehrfachvererbung | 229 |
9.7 Polymorphismus und SFML – TicTacToe reloaded | 230 |
9.8 Probleme der Modellierung mit Vererbung | 237 |
9.9 C++-Quiz | 238 |
10 Fehlerbehandlung | 240 |
10.1 Fehler erkennen und signalisieren | 241 |
10.2 Fehler behandeln | 241 |
10.3 Vordefinierte Exceptions | 245 |
10.4 Eigene Exception-Klasse | 246 |
10.5 C++-Quiz | 248 |
11 Interaktives Spiel mit Grafik und Sound | 250 |
11.1 Anzeige des Spielergebnisses | 252 |
11.2 Einfache grafische Komponenten | 254 |
11.2.1 Der Mond | 254 |
11.2.2 Die fallenden Objekte | 255 |
11.3 Sprites | 257 |
11.3.1 Der Vogel | 260 |
11.4 Spielablauf | 261 |
12 Überladen von Operatoren | 270 |
12.1 Zeiger als Beobachter: Operatoren -> und * | 273 |
12.2 ++, ==, << und weitere | 275 |
12.2.1 Typumwandlung | 280 |
12.2.2 ++ vorangestellt (Präfix) | 280 |
12.2.3 ++ nachgestellt (Postfix) | 282 |
12.2.4 Gleichheitsoperator | 283 |
12.2.5 Subtraktion | 285 |
12.2.6 Ausgabeoperator << | 285 |
12.2.7 Eingabeoperator >> | 287 |
12.2.8 Objekte als Funktion | 288 |
12.2.9 Indexoperator [] | 288 |
12.2.10 Arithmetische Operatoren += und + | 290 |
12.2.11 Zuweisungsoperator | 292 |
12.2.12 new, delete und die großen Drei | 295 |
12.3 Empfehlungen | 299 |
12.4 C++-Quiz | 300 |
13 Die C++-Standardbibliothek | 302 |
13.1 Templates | 303 |
13.1.1 Funktions-Template | 304 |
13.1.2 Template-Spezialisierung | 306 |
13.1.3 Klassen-Template | 308 |
13.2 Funktionsobjekte und Lambda-Funktionen | 310 |
13.2.1 Funktionsobjekte | 311 |
13.2.2 Lambda-Funktionen | 315 |
13.3 Paare | 316 |
13.4 Iteratoren | 318 |
13.4.1 Iterator-Kategorien | 322 |
13.5 Algorithmen | 323 |
13.5.1 Funktionsweise | 323 |
13.5.2 sort | 325 |
13.5.3 find | 325 |
13.5.4 binary_search und lower_bound | 327 |
13.5.5 copy | 329 |
13.5.6 remove und erase | 330 |
13.5.7 fill | 331 |
13.5.8 Folge mit fortlaufenden Werten füllen | 332 |
13.5.9 generate | 332 |
13.5.10 min und max | 333 |
13.5.11 min_element und max_element | 334 |
13.5.12 accumulate | 334 |
13.5.13 Skalarprodukt | 336 |
13.6 Container | 337 |
13.6.1 Gemeinsame Eigenschaften | 337 |
13.6.2 Sequentielle Container | 340 |
13.6.3 array | 342 |
13.6.4 vector | 342 |
13.6.5 list | 343 |
13.6.6 deque | 344 |
13.6.7 stack | 345 |
13.6.8 Assoziative Container | 345 |
13.6.9 map | 346 |
13.6.10 set | 350 |
13.6.11 unordered_map | 351 |
13.6.12 unordered_set | 352 |
13.7 Zeitmessung und Datum/Uhrzeit | 353 |
13.8 Komplexe Zahlen | 355 |
14 Referenzsemantik | 358 |
14.1 Compiler-generierte Funktionen | 359 |
14.2 Empfehlungen | 360 |
14.3 Praktische Umsetzung | 361 |
15 Ausblick | 364 |
15.1 Template-Erweiterungen | 364 |
15.2 Die C++–Standardbibliothek | 365 |
15.3 Test von C++-Programmen | 367 |
A Anhang | 368 |
A.1 Installationshinweise für Windows | 369 |
A.1.1 Compiler | 369 |
A.1.2 Entwicklungsumgebung | 369 |
A.1.3 SFML | 371 |
A.2 Installationshinweise für Linux | 372 |
A.2.1 Compiler | 372 |
A.2.2 Entwicklungsumgebung | 372 |
A.2.3 SFML | 373 |
A.3 Installationshinweise für OS X | 374 |
A.3.1 Compiler und Entwicklungsumgebung | 374 |
A.3.2 SFML | 375 |
A.4 ASCII-Tabelle | 377 |
Glossar | 380 |
Literatur | 392 |
Stichwortverzeichnis | 394 |