|
1 Einstieg in die Welt von C++ |
16 |
|
|
1.1 Die (Kurz-)Geschichte von C++ |
16 |
|
|
1.2 Der ANSI-C++-Standard |
18 |
|
|
1.3 Was benötige ich für C++? |
19 |
|
|
1.4 Welches Betriebssystem ...? |
21 |
|
|
1.5 Was kann ich von dem Buch erwarten? |
21 |
|
|
1.6 Listings zum Buch |
21 |
|
|
1.7 Aufgaben im Buch |
21 |
|
|
1.7.1 Level 1 |
22 |
|
|
1.7.2 Level 2 |
22 |
|
|
1.7.3 Level 3 |
22 |
|
|
2 Verwendung der Basisdatentypen in C++ |
23 |
|
|
2.1 Das erste Programm in C++ |
23 |
|
|
2.2 Die Standard-Eingabe- und -Ausgabestreams |
25 |
|
|
2.2.1 Die Streams von C++ |
25 |
|
|
2.2.2 Ausgabe mit »cout« |
26 |
|
|
2.2.3 Ausgabe mit »cerr« oder »clog« |
28 |
|
|
2.2.4 Eingabe mit »cin« |
28 |
|
|
2.3 Einige Symbole von C++ |
30 |
|
|
2.3.1 Bezeichner |
30 |
|
|
2.3.2 Literale |
30 |
|
|
2.3.3 Kommentare |
32 |
|
|
2.4 Grundlagen zu den Basisdatentypen |
33 |
|
|
2.4.1 Deklaration und Definition von Variablen |
33 |
|
|
2.4.2 Initialisieren einer Variablen |
35 |
|
|
2.4.3 Vereinheitlichte Initialisierung mit C++11 |
36 |
|
|
2.4.4 Ganzzahltypen |
37 |
|
|
2.4.5 Vorzeichenlos und vorzeichenbehaftet |
48 |
|
|
2.4.6 Fließkommazahlentypen |
49 |
|
|
2.4.7 Limits für die Basisdatentypen |
51 |
|
|
2.4.8 Die Byte-Größe mit dem »sizeof«-Operator |
53 |
|
|
2.4.9 Sicherheit beim Kompilieren mit »static_assert« (C++11) |
53 |
|
|
2.5 »auto«-Typ (C++11) |
54 |
|
|
2.6 Rechnen mit Zahlen |
55 |
|
|
2.6.1 Arithmetische Operatoren |
56 |
|
|
2.6.2 Ungenaue Fließkommazahlen |
58 |
|
|
2.6.3 Erweiterte Darstellung arithmetischer Operatoren |
60 |
|
|
2.6.4 Inkrement- und Dekrementoperator |
60 |
|
|
2.7 Zufallszahlen (C++11) |
62 |
|
|
2.8 Typumwandlung |
63 |
|
|
2.8.1 Implizite Umwandlung durch den Compiler |
64 |
|
|
2.8.2 Automatische Typumwandlung beschränken (C++11) |
67 |
|
|
2.8.3 Explizite Typumwandlung |
68 |
|
|
2.8.4 C++-Typumwandlungs-Operatoren |
68 |
|
|
2.8.5 Gefährliche Typumwandlung mit den alten C-Casts |
71 |
|
|
2.9 Konstanten |
72 |
|
|
2.10 Aufgaben |
73 |
|
|
2.10.1 Level 1 |
73 |
|
|
2.10.2 Level 2 |
73 |
|
|
2.10.3 Level 3 |
74 |
|
|
3 Kontrollstrukturen, Funktionen und Präprozessor-Direktiven |
75 |
|
|
3.1 Kontrollstrukturen |
75 |
|
|
3.1.1 Anweisungen und Anweisungsblöcke |
75 |
|
|
3.1.2 Verzweigungen |
76 |
|
|
3.1.3 Der Bedingungsoperator ?: |
84 |
|
|
3.1.4 Logische Operatoren |
85 |
|
|
3.1.5 Die Fallunterscheidung - »switch« |
88 |
|
|
3.1.6 Schleifen |
91 |
|
|
3.2 Funktionen |
101 |
|
|
3.2.1 Funktionen definieren |
102 |
|
|
3.2.2 Funktionen aufrufen |
103 |
|
|
3.2.3 Funktionen deklarieren |
104 |
|
|
3.2.4 Funktionsparameter (Call-by-Value) |
105 |
|
|
3.2.5 Standardparameter |
106 |
|
|
3.2.6 Rückgabewert von Funktionen |
108 |
|
|
3.2.7 Funktionen überladen |
110 |
|
|
3.2.8 Gültigkeitsbereich von lokalen und globalen Variablen |
112 |
|
|
3.2.9 Inline-Funktionen |
114 |
|
|
3.2.10 Die »main«-Funktion |
116 |
|
|
3.2.11 Programmende |
117 |
|
|
3.3 Präprozessor-Direktiven |
118 |
|
|
3.3.1 Die »#include«-Direktive |
119 |
|
|
3.3.2 Die »#define«-Direktive |
120 |
|
|
3.3.3 Bedingte Kompilierung |
122 |
|
|
3.3.4 Weitere Präprozessor-Direktiven |
124 |
|
|
3.4 Aufgaben |
125 |
|
|
3.4.1 Level 1 |
125 |
|
|
3.4.2 Level 2 |
125 |
|
|
3.4.3 Level 3 |
127 |
|
|
4 Höhere und fortgeschrittene Datentypen |
128 |
|
|
4.1 Zeiger |
128 |
|
|
4.1.1 Zeiger deklarieren |
129 |
|
|
4.1.2 Adresse im Zeiger speichern |
130 |
|
|
4.1.3 Zeiger dereferenzieren |
132 |
|
|
4.1.4 Speichergröße von Zeigern |
135 |
|
|
4.1.5 Zeigerarithmetik |
135 |
|
|
4.2 Referenzen |
136 |
|
|
4.3 Arrays |
138 |
|
|
4.3.1 Der C++-Container »vector« |
139 |
|
|
4.3.2 C-Arrays |
143 |
|
|
4.4 Zeichenketten verwenden |
147 |
|
|
4.4.1 Der C++-Container »string« |
147 |
|
|
4.4.2 Unterstützung von Unicode (C++11) |
149 |
|
|
4.4.3 C-Zeichenketten |
151 |
|
|
4.5 Höhere Datentypen bei Funktionen verwenden |
154 |
|
|
4.5.1 Zeiger als Funktionsparameter |
154 |
|
|
4.5.2 Zeiger als Rückgabewert |
156 |
|
|
4.5.3 Referenzen als Funktionsparameter |
158 |
|
|
4.5.4 Referenzen als Rückgabewert |
159 |
|
|
4.5.5 C-Arrays oder C-Strings als Funktionsparameter |
161 |
|
|
4.6 Dynamische Speicherobjekte |
164 |
|
|
4.6.1 Dynamisch Objekte mit »new« anlegen |
165 |
|
|
4.6.2 Fehler bei der Speicheranforderung abfangen |
166 |
|
|
4.6.3 Speicher mit »delete« wieder freigeben |
167 |
|
|
4.7 Strukturen |
169 |
|
|
4.7.1 Strukturen deklarieren |
170 |
|
|
4.7.2 Zugriff auf die Strukturelemente |
171 |
|
|
4.7.3 Zugriff auf die Elemente über Strukturzeiger |
172 |
|
|
4.7.4 Strukturen vergleichen |
174 |
|
|
4.7.5 Dynamische Datenstrukturen mit Strukturen |
174 |
|
|
4.8 Union |
178 |
|
|
4.9 Aufzählungstyp »enum« |
179 |
|
|
4.10 Eigene Namen mit »typedef« |
182 |
|
|
4.11 Aufgaben |
183 |
|
|
4.11.1 Level 1 |
184 |
|
|
4.11.2 Level 2 |
184 |
|
|
4.11.3 Level 3 |
186 |
|
|
5 Modularisierung |
187 |
|
|
5.1 Namensräume |
187 |
|
|
5.1.1 Neuen Namensbereich deklarieren |
187 |
|
|
5.1.2 Namensbereich verschachteln |
190 |
|
|
5.1.3 Namensbereich ist ein eigener Gültigkeitsbereich |
190 |
|
|
5.1.4 Namensbereich mit »using« importieren |
193 |
|
|
5.1.5 Einzelne Bezeichner mit »using« importieren |
193 |
|
|
5.1.6 Aliasse für Namensbereiche |
194 |
|
|
5.1.7 Namensraum »std« |
194 |
|
|
5.2 Speicherklassenattribute |
196 |
|
|
5.2.1 Schlüsselwort »extern« |
196 |
|
|
5.2.2 Schlüsselwort »static« |
197 |
|
|
5.3 Typqualifikatoren |
200 |
|
|
5.3.1 Schlüsselwort »const« |
200 |
|
|
5.3.2 Schlüsselwort »volatile« |
201 |
|
|
5.4 Weitere Attribute |
202 |
|
|
5.5 Modulare Programmierung |
202 |
|
|
5.5.1 Aufteilung |
204 |
|
|
5.5.2 Die öffentliche Schnittstelle (Headerdatei) |
205 |
|
|
5.5.3 Private Datei(en) |
207 |
|
|
5.5.4 Die Client-Datei |
207 |
|
|
5.5.5 Nur Objektcode oder Bibliothek vorhanden |
208 |
|
|
5.6 Aufgaben |
208 |
|
|
5.6.1 Level 1 |
209 |
|
|
5.6.2 Level 2 |
209 |
|
|
6 Klassen |
211 |
|
|
6.1 Abstraktionsmechanismus |
211 |
|
|
6.2 Klassen |
212 |
|
|
6.2.1 Klassendefinition |
212 |
|
|
6.2.2 Elementfunktionen definieren |
214 |
|
|
6.2.3 Zugriffskontrolle mit »public« und »private« |
216 |
|
|
6.2.4 Zugriff auf die Daten innerhalb einer Klasse |
218 |
|
|
6.2.5 Objekte erzeugen und benutzen |
219 |
|
|
6.3 Konstruktoren |
224 |
|
|
6.3.1 Konstruktoren deklarieren |
225 |
|
|
6.3.2 Konstruktoren definieren |
226 |
|
|
6.3.3 Implizite Konvertierungen verhindern - »explicit« |
228 |
|
|
6.3.4 Konstruktoren delegieren (C++11) |
230 |
|
|
6.3.5 Standardkonstruktor (Default-Konstruktor) |
232 |
|
|
6.3.6 Kopierkonstruktor |
233 |
|
|
6.3.7 Move-Konstruktor (C++11) |
235 |
|
|
6.4 Destruktoren |
237 |
|
|
6.4.1 Destruktor deklarieren |
237 |
|
|
6.4.2 Destruktor definieren |
238 |
|
|
6.5 Elementfunktionen |
241 |
|
|
6.5.1 Inline-Elementfunktionen |
241 |
|
|
6.5.2 Konstante Elementfunktionen (read-only) |
244 |
|
|
6.5.3 »this«-Zeiger |
246 |
|
|
6.6 Aufgaben |
247 |
|
|
6.6.1 Level 1 |
248 |
|
|
6.6.2 Level 2 |
248 |
|
|
6.6.3 Level 3 |
249 |
|
|
7 Objekte und Klassenelemente |
250 |
|
|
7.1 Konstante Objekte |
250 |
|
|
7.2 Objekte als (Element-)Funktionsargumente |
251 |
|
|
7.2.1 Hilfsfunktionen |
251 |
|
|
7.2.2 Wertübergabe als Kopie (Call-by-Value) |
252 |
|
|
7.2.3 Wertübergabe als Zeiger |
254 |
|
|
7.2.4 Wertübergabe als Referenz |
256 |
|
|
7.2.5 Wertübergabe bei Elementfunktionen |
257 |
|
|
7.2.6 »this«-Zeiger |
258 |
|
|
7.3 Objekte als Rückgabewerte |
261 |
|
|
7.4 Arrays von Objekten |
263 |
|
|
7.5 Dynamische Objekte |
264 |
|
|
7.6 Mehr zu den Klassenelementen |
266 |
|
|
7.6.1 Dynamische Klassenelemente |
266 |
|
|
7.6.2 Statische Klassenelemente |
274 |
|
|
7.6.3 Konstante Klassenelemente |
277 |
|
|
7.7 Andere Klassenobjekte als Datenelement einer Klasse |
278 |
|
|
7.8 Elementinitialisierer |
284 |
|
|
7.9 Gute Freunde (»friend«) |
286 |
|
|
7.10 Aufgaben |
288 |
|
|
7.10.1 Level 1 |
289 |
|
|
7.10.2 Level 2 |
289 |
|
|
7.10.3 Level 3 |
290 |
|
|
8 Operatoren überladen |
291 |
|
|
8.1 Schlüsselwort »operator« |
292 |
|
|
8.2 Zweistellige (arithmetische) Operatoren überladen |
294 |
|
|
8.2.1 Operatorüberladung als Elementfunktion einer Klasse |
295 |
|
|
8.2.2 Operatorüberladung als globale Hilfsfunktion |
298 |
|
|
8.2.3 Zweistellige Operatoren zusammengefasst |
300 |
|
|
8.3 Einstellige Operatoren überladen |
300 |
|
|
8.4 Zuweisungsoperator überladen |
304 |
|
|
8.5 Ein-/Ausgabeoperator überladen |
306 |
|
|
8.5.1 Eingabeoperator >> überladen |
307 |
|
|
8.5.2 Ausgabeoperator << überladen |
308 |
|
|
8.6 Weitere Operatorüberladungen |
309 |
|
|
8.7 Konvertierungsoperatoren |
310 |
|
|
8.7.1 Konvertierungskonstruktor |
311 |
|
|
8.7.2 Globale Konvertierungsfunktion |
312 |
|
|
8.8 Aufgaben |
315 |
|
|
8.8.1 Level 1 |
315 |
|
|
8.8.2 Level 2 |
315 |
|
|
8.8.3 Level 3 |
316 |
|
|
9 Vererbung (Abgeleitete Klassen) |
317 |
|
|
9.1 Die Vorbereitung |
318 |
|
|
9.2 Die Ableitung einer Klasse |
319 |
|
|
9.2.1 »public«-Zugriffsrechte einer abgeleiteten Klasse |
321 |
|
|
9.2.2 Erben und erweitern |
321 |
|
|
9.2.3 Zugriff auf die Daten |
322 |
|
|
9.2.4 Redefinition von Elementfunktionen |
324 |
|
|
9.2.5 Konstruktoren |
325 |
|
|
9.2.6 Destruktor |
327 |
|
|
9.2.7 Programmbeispiel |
327 |
|
|
9.2.8 Zugriffsrecht »protected« |
328 |
|
|
9.2.9 Zugriffsrechte bei der Vererbung von Klassen |
329 |
|
|
9.2.10 Implizite Typumwandlung abgeleiteter Klassen |
331 |
|
|
9.2.11 Konstruktoren vererben (C++11) |
332 |
|
|
9.3 Mehrfachvererbung |
333 |
|
|
9.4 Virtuelle Vererbung |
337 |
|
|
9.5 Aufgaben |
342 |
|
|
9.5.1 Level 1 |
342 |
|
|
9.5.2 Level 2 |
343 |
|
|
9.5.3 Level 3 |
344 |
|
|
10 Templates |
345 |
|
|
10.1 Funktions-Templates |
345 |
|
|
10.1.1 Funktions-Template definieren |
346 |
|
|
10.1.2 Typübereinstimmung |
348 |
|
|
10.1.3 Funktions-Templates über mehrere Module |
349 |
|
|
10.1.4 Funktions-Template spezialisieren |
349 |
|
|
10.1.5 Templates mit verschiedenen Parametern |
350 |
|
|
10.1.6 Explizite Template-Argumente |
352 |
|
|
10.2 Klassen-Templates |
353 |
|
|
10.2.1 Klassen-Template definieren |
354 |
|
|
10.2.2 Elementfunktionen von Klassen-Templates definieren |
355 |
|
|
10.2.3 Klassen-Template instantiieren |
358 |
|
|
10.3 Templates der Standardbibliothek |
361 |
|
|
10.3.1 Container der Standardbibliothek |
362 |
|
|
10.3.2 Iteratoren |
366 |
|
|
10.3.3 Algorithmen |
366 |
|
|
10.4 Aufgaben |
368 |
|
|
10.4.1 Level 1 |
368 |
|
|
10.4.2 Level 2 |
368 |
|
|
10.4.3 Level 3 |
369 |
|
|
11 Exception-Handling (Fehlerbehandlung) |
371 |
|
|
11.1 Exception auslösen |
372 |
|
|
11.2 Exception auffangen und behandeln |
372 |
|
|
11.2.1 »terminate«-Handler einrichten |
376 |
|
|
11.2.2 Alternatives »catch (...)« |
377 |
|
|
11.2.3 Stack-Abwicklung |
377 |
|
|
11.3 Ausnahme-Klassen (Fehlerklassen) |
378 |
|
|
11.4 Standard-Exceptions |
380 |
|
|
11.4.1 Virtuelle Methode »what()« |
381 |
|
|
11.4.2 Anwenden der Standard-Exceptions |
381 |
|
|
11.5 System-Exceptions |
385 |
|
|
11.5.1 »bad_alloc« |
385 |
|
|
11.5.2 »bad_cast« |
385 |
|
|
11.5.3 »bad_typeid« |
385 |
|
|
11.5.4 »bad_exception« |
386 |
|
|
11.6 »noexcept« (C++11) |
386 |
|
|
11.7 Aufgaben |
388 |
|
|
11.7.1 Level 1 |
388 |
|
|
12 Weitere Neuigkeiten in C++11 |
389 |
|
|
12.1 Grundsätzliche Neuerungen in der Kernsprache |
389 |
|
|
12.1.1 Range-based »for«-Schleife |
389 |
|
|
12.1.2 Lambda-Funktionen |
390 |
|
|
12.1.3 RValue (neue Move-Semantik) |
391 |
|
|
12.1.4 Generische Programmierung - Variadic Templates |
392 |
|
|
12.1.5 »decltype« und die neue Rückgabesyntax |
394 |
|
|
12.1.6 »constexpr« |
397 |
|
|
12.2 Standardbibliothek - neue Bibliotheken |
398 |
|
|
12.2.1 Reguläre Ausdrücke |
398 |
|
|
12.2.2 Zeitbibliothek |
400 |
|
|
12.2.3 Smart Pointer |
404 |
|
|
12.3 Multithreading |
407 |
|
|
12.3.1 Einfache Threads erzeugen |
408 |
|
|
12.3.2 Chaos vermeiden |
410 |
|
|
Lösungen der Übungsaufgaben |
413 |
|
|
Lösungen zu Kapitel 2 |
413 |
|
|
Lösungen Level 1 |
413 |
|
|
Lösungen Level 2 |
413 |
|
|
Lösung Level 3 |
414 |
|
|
Lösungen zu Kapitel 3 |
415 |
|
|
Lösungen Level 1 |
415 |
|
|
Lösungen Level 2 |
416 |
|
|
Lösungen Level 3 |
417 |
|
|
Lösungen zu Kapitel 4 |
418 |
|
|
Lösungen Level 1 |
418 |
|
|
Lösungen Level 2 |
420 |
|
|
Lösungen Level 3 |
421 |
|
|
Lösungen zu Kapitel 5 |
422 |
|
|
Lösungen Level 1 |
422 |
|
|
Lösungen Level 2 |
423 |
|
|
Lösungen zu Kapitel 6 |
424 |
|
|
Lösungen Level 1 |
424 |
|
|
Lösungen Level 2 |
425 |
|
|
Lösung Level 3 |
426 |
|
|
Lösungen zu Kapitel 7 |
428 |
|
|
Lösungen Level 1 |
428 |
|
|
Lösungen Level 2 |
428 |
|
|
Lösungen Level 3 |
429 |
|
|
Lösungen zu Kapitel 8 |
432 |
|
|
Lösungen Level 1 |
432 |
|
|
Lösung Level 2 |
433 |
|
|
Lösung Level 3 |
434 |
|
|
Lösungen zu Kapitel 9 |
435 |
|
|
Lösungen Level 1 |
435 |
|
|
Lösung Level 2 |
436 |
|
|
Lösung Level 3 |
437 |
|
|
Lösungen zu Kapitel 10 |
438 |
|
|
Lösungen Level 1 |
438 |
|
|
Lösungen Level 2 |
438 |
|
|
Lösung Level 3 |
439 |
|
|
Lösungen zu Kapitel 11 |
440 |
|
|
Lösungen Level 1 |
440 |
|