|
Liebe Leserin, lieber Leser, |
3 |
|
|
Auf einen Blick |
4 |
|
|
Inhalt |
6 |
|
|
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 Schreibkonventionen |
21 |
|
|
1.6 Was kann ich von dem Buch erwarten? |
22 |
|
|
1.7 Listings zum Buch |
22 |
|
|
1.8 Aufgaben im Buch |
22 |
|
|
1.8.1 Level 1 |
22 |
|
|
1.8.2 Level 2 |
23 |
|
|
1.8.3 Level 3 |
23 |
|
|
2 Verwendung der Basisdatentypen in C++ |
24 |
|
|
2.1 Das erste Programm in C++ |
24 |
|
|
2.2 Die Standard-Ein-/Ausgabestreams |
27 |
|
|
2.2.1 Die Streams von C++ |
27 |
|
|
2.2.2 Ausgabe mit »cout« |
28 |
|
|
2.2.3 Ausgabe mit »cerr« oder »clog« |
29 |
|
|
2.2.4 Eingabe mit »cin« |
30 |
|
|
2.3 Einige Symbole von C++ |
31 |
|
|
2.3.1 Bezeichner |
31 |
|
|
2.3.2 Literale |
32 |
|
|
2.3.3 Kommentare |
33 |
|
|
2.4 Grundlagen zu den Basisdatentypen |
34 |
|
|
2.4.1 Deklaration und Definition |
34 |
|
|
2.4.2 Initialisieren einer Variablen |
36 |
|
|
2.4.3 Ganzzahltypen |
36 |
|
|
2.4.4 Vorzeichenlos und vorzeichenbehaftet |
43 |
|
|
2.4.5 Fließkommazahlentypen |
45 |
|
|
2.4.6 Limits für die Basisdatentypen |
47 |
|
|
2.5 Rechnen mit Zahlen |
48 |
|
|
2.5.1 Arithmetische Operatoren |
49 |
|
|
2.5.2 Ungenaue Fließkommazahlen |
51 |
|
|
2.5.3 Erweiterte Darstellung arithmetischer Operatoren |
53 |
|
|
2.5.4 Inkrement- und Dekrementoperator |
53 |
|
|
2.6 Typumwandlung |
55 |
|
|
2.6.1 Implizite Umwandlung des Compilers |
55 |
|
|
2.6.2 Explizite Typumwandlung |
59 |
|
|
2.6.3 Neue C++-Typumwandlungs-Operatoren |
61 |
|
|
2.7 Konstanten |
64 |
|
|
2.8 Aufgaben |
64 |
|
|
2.8.1 Level 1 |
65 |
|
|
2.8.2 Level 2 |
65 |
|
|
2.8.3 Level 3 |
66 |
|
|
3 Kontrollstrukturen, Funktionen und Präprozessor- Direktiven |
68 |
|
|
3.1 Kontrollstrukturen |
68 |
|
|
3.1.1 Anweisungen und Anweisungsblöcke |
68 |
|
|
3.1.2 Verzweigungen |
69 |
|
|
3.1.3 Der Bedingungsoperator ?: |
77 |
|
|
3.1.4 Logische Operatoren |
77 |
|
|
3.1.5 Die Fallunterscheidung – »switch« |
80 |
|
|
3.1.6 Schleifen |
83 |
|
|
3.2 Funktionen |
93 |
|
|
3.2.1 Funktionen definieren |
94 |
|
|
3.2.2 Funktionen aufrufen |
95 |
|
|
3.2.3 Funktionen deklarieren |
96 |
|
|
3.2.4 Funktionsparameter (Call-by-Value) |
97 |
|
|
3.2.5 Standardparameter |
98 |
|
|
3.2.6 Rückgabewert von Funktionen |
100 |
|
|
3.2.7 Funktionen überladen |
102 |
|
|
3.2.8 Gültigkeitsbereich von lokalen und globalen Variablen |
104 |
|
|
3.2.9 Inline-Funktionen |
106 |
|
|
3.2.10 Die »main«-Funktion |
107 |
|
|
3.2.11 Programmende |
108 |
|
|
3.3 Präprozessor-Direktiven |
109 |
|
|
3.3.1 Die »#include«-Direktive |
110 |
|
|
3.3.2 Die »#define«-Direktive |
112 |
|
|
3.3.3 Bedingte Kompilierung |
117 |
|
|
3.3.4 Weitere Präprozessor-Direktiven |
119 |
|
|
3.4 Aufgaben |
120 |
|
|
3.4.1 Level 1 |
120 |
|
|
3.4.2 Level 2 |
121 |
|
|
3.4.3 Level 3 |
122 |
|
|
4 Höhere und fortgeschrittene Datentypen |
124 |
|
|
4.1 Zeiger |
124 |
|
|
4.1.1 Zeiger deklarieren |
125 |
|
|
4.1.2 Adresse im Zeiger speichern |
125 |
|
|
4.1.3 Zeiger dereferenzieren |
127 |
|
|
4.1.4 Speichergröße von Zeigern |
129 |
|
|
4.1.5 Zeigerarithmetik |
130 |
|
|
4.1.6 Mehrfache Indirektion |
131 |
|
|
4.1.7 void-Zeiger |
131 |
|
|
4.2 Referenzen |
132 |
|
|
4.3 Arrays |
134 |
|
|
4.3.1 Der C++-Standardtyp »vector« |
134 |
|
|
4.3.2 C-Arrays |
137 |
|
|
4.4 Zeichenketten verwenden |
141 |
|
|
4.4.1 Der C++-Standardtyp »string« |
141 |
|
|
4.4.2 C-Zeichenketten |
143 |
|
|
4.5 C-Arrays und C-Strings versus Zeiger |
145 |
|
|
4.5.1 C-Array und Zeiger |
146 |
|
|
4.5.2 C-String und Zeiger |
148 |
|
|
4.5.3 Zeigerarrays |
149 |
|
|
4.6 Höhere Datentypen bei Funktionen verwenden |
150 |
|
|
4.6.1 Zeiger als Funktionsparameter |
151 |
|
|
4.6.2 Zeiger als Rückgabewert |
153 |
|
|
4.6.3 Referenzen als Funktionsparameter |
154 |
|
|
4.6.4 Referenzen als Rückgabewert |
155 |
|
|
4.6.5 C-Arrays oder C-Strings als Funktionsparameter |
158 |
|
|
4.7 Dynamische Speicherobjekte |
160 |
|
|
4.7.1 Dynamisch Objekte mit »new« anlegen |
161 |
|
|
4.7.2 Fehler bei der Speicheranforderung abfangen |
163 |
|
|
4.7.3 Speicher mit »delete« wieder freigeben |
163 |
|
|
4.8 Strukturen |
165 |
|
|
4.8.1 Strukturen deklarieren |
166 |
|
|
4.8.2 Zugriff auf die Strukturelemente |
166 |
|
|
4.8.3 Zugriff auf die Elemente über Strukturzeiger |
167 |
|
|
4.8.4 Strukturen vergleichen |
169 |
|
|
4.8.5 Dynamische Datenstrukturen mit Strukturen |
169 |
|
|
4.9 Union |
173 |
|
|
4.10 Aufzählungstyp »enum« |
174 |
|
|
4.11 Eigene Namen mit »typedef« |
175 |
|
|
4.12 Aufgaben |
176 |
|
|
4.12.1 Level 1 |
176 |
|
|
4.12.2 Level 2 |
177 |
|
|
4.12.3 Level 3 |
178 |
|
|
5 Modularisierung |
180 |
|
|
5.1 Namensräume |
180 |
|
|
5.1.1 Neuen Namensbereich deklarieren |
180 |
|
|
5.1.2 Namensbereich verschachteln |
182 |
|
|
5.1.3 Namensbereich ist ein eigener Gültigkeitsbereich |
182 |
|
|
5.1.4 Namensbereich mit »using« importieren |
185 |
|
|
5.1.5 Einzelne Bezeichner mit »using« importieren |
186 |
|
|
5.1.6 Aliasse für Namensbereiche |
186 |
|
|
5.2 Speicherklassenattribute |
186 |
|
|
5.2.1 Schlüsselwort »extern« |
187 |
|
|
5.2.2 Schlüsselwort »static« |
187 |
|
|
5.2.3 Schlüsselwort »register« |
190 |
|
|
5.2.4 Schlüsselwort »auto« |
191 |
|
|
5.3 Typqualifikatoren |
192 |
|
|
5.3.1 Schlüsselwort »const« |
192 |
|
|
5.3.2 Schlüsselwort »volatile« |
193 |
|
|
5.4 Funktionsattribute |
194 |
|
|
5.5 Modulare Programmierung |
194 |
|
|
5.5.1 Aufteilung |
195 |
|
|
5.5.2 Die öffentliche Schnittstelle (Headerdatei) |
197 |
|
|
5.5.3 Private Datei(en) |
198 |
|
|
5.5.4 Die Client-Datei |
199 |
|
|
5.5.5 Nur Objektcode oder Bibliothek vorhanden |
200 |
|
|
5.6 Aufgaben |
200 |
|
|
5.6.1 Level 1 |
200 |
|
|
5.6.2 Level 2 |
201 |
|
|
6 Klassen |
204 |
|
|
6.1 Abstraktionsmechanismus |
204 |
|
|
6.2 Klassen |
205 |
|
|
6.2.1 Klassendefinition |
205 |
|
|
6.2.2 Elementfunktionen definieren |
206 |
|
|
6.2.3 Zugriffskontrolle mit »public« und »private« |
208 |
|
|
6.2.4 Zugriff auf die Daten innerhalb einer Klasse |
211 |
|
|
6.2.5 Objekte erzeugen und benutzen |
211 |
|
|
6.3 Konstruktoren |
216 |
|
|
6.3.1 Konstruktoren deklarieren |
217 |
|
|
6.3.2 Konstruktoren definieren |
218 |
|
|
6.3.3 Standardkonstruktor (Default-Konstruktor) |
220 |
|
|
6.3.4 Kopierkonstruktor |
221 |
|
|
6.4 Destruktoren |
222 |
|
|
6.4.1 Destruktor deklarieren |
222 |
|
|
6.4.2 Destruktor definieren |
223 |
|
|
6.5 Elementfunktionen |
225 |
|
|
6.5.1 Inline-Elementfunktionen |
225 |
|
|
6.5.2 Konstante Elementfunktionen (read-only) |
228 |
|
|
6.5.3 this-Zeiger |
230 |
|
|
6.6 Aufgaben |
231 |
|
|
6.6.1 Level 1 |
231 |
|
|
6.6.2 Level 2 |
232 |
|
|
6.6.3 Level 3 |
233 |
|
|
7 Objekte und Klassenelemente |
234 |
|
|
7.1 Konstante Objekte |
234 |
|
|
7.2 Objekte als (Element-)Funktionsargumente |
235 |
|
|
7.2.1 Hilfsfunktionen |
235 |
|
|
7.2.2 Wertübergabe als Kopie (Call-by-Value) |
236 |
|
|
7.2.3 Wertübergabe als Zeiger (Call-by-Reference) |
238 |
|
|
7.2.4 Wertübergabe als Referenz |
240 |
|
|
7.2.5 Wertübergabe bei Elementfunktionen |
240 |
|
|
7.2.6 *this-Zeiger |
243 |
|
|
7.3 Objekte als Rückgabewerte |
245 |
|
|
7.4 Arrays von Objekten |
247 |
|
|
7.5 Dynamische Objekte |
248 |
|
|
7.6 Mehr zu den Klassenelementen |
251 |
|
|
7.6.1 Dynamische Klassenelemente |
251 |
|
|
7.6.2 Statische Klassenelemente |
258 |
|
|
7.7 Andere Klassenobjekte als Datenelement einer Klasse |
261 |
|
|
7.8 Gute Freunde (»friend«) |
268 |
|
|
7.9 Aufgaben |
271 |
|
|
7.9.1 Level 1 |
271 |
|
|
7.9.2 Level 2 |
271 |
|
|
7.9.3 Level 3 |
273 |
|
|
8 Operatoren überladen |
274 |
|
|
8.1 Schlüsselwort »operator« |
275 |
|
|
8.2 Zweistellige (arithmetische) Operatoren überladen |
277 |
|
|
8.2.1 Operatorüberladung als Elementfunktion einer Klasse |
278 |
|
|
8.2.2 Operatorüberladung als globale Hilfsfunktion |
281 |
|
|
8.2.3 Zweistellige Operatoren zusammengefasst |
283 |
|
|
8.3 Einstellige Operatoren überladen |
283 |
|
|
8.4 Zuweisungsoperator überladen |
286 |
|
|
8.5 Ein-/Ausgabeoperator überladen |
289 |
|
|
8.5.1 Eingabeoperator >> überladen |
289 |
|
|
8.5.2 Ausgabeoperator << überladen |
290 |
|
|
8.6 Weitere Operatorüberladungen |
292 |
|
|
8.7 Konvertierungsoperatoren |
293 |
|
|
8.7.1 Konvertierungskonstruktor |
293 |
|
|
8.7.2 Globale Konvertierungsfunktion |
295 |
|
|
8.8 Aufgaben zu Kapitel 8 |
297 |
|
|
8.8.1 Level 1 |
297 |
|
|
8.8.2 Level 2 |
297 |
|
|
8.8.3 Level 3 |
298 |
|
|
9 Vererbung (Abgeleitete Klassen) |
300 |
|
|
9.1 Die Vorbereitung |
301 |
|
|
9.2 Die Ableitung einer Klasse |
302 |
|
|
9.2.1 »public«-Zugriffsrechte einer abgeleiteten Klasse |
304 |
|
|
9.2.2 Erben und erweitern |
304 |
|
|
9.2.3 Zugriff auf die Daten |
305 |
|
|
9.2.4 Redefinition von Elementfunktionen |
307 |
|
|
9.2.5 Konstruktoren |
308 |
|
|
9.2.6 Destruktor |
309 |
|
|
9.2.7 Programmbeispiel |
310 |
|
|
9.2.8 Zugriffsrecht »protected« |
310 |
|
|
9.2.9 Zugriffsrechte bei der Vererbung von Klassen |
312 |
|
|
9.2.10 Implizite Typumwandlung abgeleiteter Klassen |
314 |
|
|
9.3 Mehrfachvererbung |
315 |
|
|
9.4 Virtuelle Vererbung |
319 |
|
|
9.5 Aufgaben für Kapitel 9 |
324 |
|
|
9.5.1 Level 1 |
324 |
|
|
9.5.2 Level 2 |
324 |
|
|
9.5.3 Level 3 |
325 |
|
|
10 Abstrakte Klassen |
326 |
|
|
10.1 Abstrakte Klasse erstellen |
326 |
|
|
10.2 Vorteil von abstrakten Klassen |
330 |
|
|
10.3 Virtuelle Destruktoren |
330 |
|
|
10.4 typeinfo |
332 |
|
|
10.5 Aufgaben für Kapitel 10 |
333 |
|
|
10.5.1 Level 1 |
333 |
|
|
10.5.2 Level 2 |
333 |
|
|
10.5.3 Level 3 |
335 |
|
|
11 Templates |
336 |
|
|
11.1 Funktions-Templates |
336 |
|
|
11.1.1 Funktions-Template definieren |
337 |
|
|
11.1.2 Typübereinstimmung |
339 |
|
|
11.1.3 Funktions-Templates über mehrere Module |
339 |
|
|
11.1.4 Funktions-Template spezialisieren |
340 |
|
|
11.1.5 Templates mit verschiedenen Parametern |
341 |
|
|
11.1.6 Explizite Template-Argumente |
343 |
|
|
11.2 Klassen-Templates |
344 |
|
|
11.2.1 Klassen-Template definieren |
344 |
|
|
11.2.2 Elementfunktionen von Klassen-Templates definieren |
345 |
|
|
11.2.3 Klassen-Template instantiieren |
349 |
|
|
11.3 STL (Standard Template Library) |
352 |
|
|
11.3.1 Container von STL |
352 |
|
|
11.3.2 Iteratoren |
356 |
|
|
11.3.3 Algorithmen |
356 |
|
|
11.4 Aufgaben für Kapitel 11 |
357 |
|
|
11.4.1 Level 1 |
357 |
|
|
11.4.2 Level 2 |
358 |
|
|
11.4.3 Level 3 |
359 |
|
|
12 Exception-Handling (Fehlerbehandlung) |
360 |
|
|
12.1 Exception auslösen |
361 |
|
|
12.2 Exception auffangen und behandeln |
361 |
|
|
12.2.1 »terminate«-Handler einrichten |
365 |
|
|
12.2.2 Alternatives »catch (...)« |
366 |
|
|
12.2.3 Stack-Abwicklung |
366 |
|
|
12.3 Ausnahme-Klassen (Fehlerklassen) |
367 |
|
|
12.4 Standard-Exceptions |
369 |
|
|
12.4.1 Virtuelle Methode »what()« |
370 |
|
|
12.4.2 Anwenden der Standard-Exceptions |
370 |
|
|
12.5 System-Exceptions |
374 |
|
|
12.5.1 bad_alloc |
374 |
|
|
12.5.2 bad_cast |
374 |
|
|
12.5.3 bad_typeid |
374 |
|
|
12.5.4 bad_exception |
375 |
|
|
12.6 Aufgaben für Kapitel 12 |
375 |
|
|
12.6.1 Level 1 |
375 |
|
|
A Lösungen der Übungsaufgaben |
376 |
|
|
A. 1 Lösungen zum Kapitel 2 |
376 |
|
|
A.1.1 Lösungen Level 1 |
376 |
|
|
A.1.2 Lösungen Level 2 |
376 |
|
|
A.1.3 Lösung Level 3 |
377 |
|
|
A. 2 Lösungen zum Kapitel 3 |
378 |
|
|
A.2.1 Lösungen Level 1 |
378 |
|
|
A.2.2 Lösungen Level 2 |
379 |
|
|
A.2.3 Lösungen Level 3 |
380 |
|
|
A. 3 Lösungen zum Kapitel 4 |
381 |
|
|
A.3.1 Lösungen Level 1 |
381 |
|
|
A.3.2 Lösungen Level 2 |
383 |
|
|
A.3.3 Lösungen Level 3 |
384 |
|
|
A. 4 Lösungen zum Kapitel 5 |
385 |
|
|
A.4.1 Lösungen Level 1 |
385 |
|
|
A.4.2 Lösungen Level 2 |
386 |
|
|
A. 5 Lösungen zum Kapitel 6 |
387 |
|
|
A.5.1 Lösungen Level 1 |
387 |
|
|
A.5.2 Lösungen Level 2 |
388 |
|
|
A.5.3 Lösung Level 3 |
389 |
|
|
A. 6 Lösungen zum Kapitel 7 |
390 |
|
|
A.6.1 Lösungen Level 1 |
390 |
|
|
A.6.2 Lösungen Level 2 |
391 |
|
|
A.6.3 Lösungen Level 3 |
392 |
|
|
A. 7 Lösungen zum Kapitel 8 |
395 |
|
|
A.7.1 Lösungen Level 1 |
395 |
|
|
A.7.2 Lösung Level 2 |
396 |
|
|
A.7.3 Lösung Level 3 |
397 |
|
|
A. 8 Lösungen zum Kapitel 9 |
398 |
|
|
A.8.1 Lösungen Level 1 |
398 |
|
|
A.8.2 Lösung Level 2 |
399 |
|
|
A.8.3 Lösung Level 3 |
400 |
|
|
A. 9 Lösungen zum Kapitel 10 |
401 |
|
|
A.9.1 Lösungen Level 1 |
401 |
|
|
A.9.2 Lösung Level 2 |
402 |
|
|
A.9.3 Lösung Level 3 |
404 |
|
|
A. 10 Lösungen zum Kapitel 11 |
404 |
|
|
A.10.1 Lösungen Level 1 |
404 |
|
|
A.10.2 Lösungen Level 2 |
405 |
|
|
A.10.3 Lösung Level 3 |
405 |
|
|
A. 11 Lösungen zum Kapitel 12 |
407 |
|
|
A.11.1 Lösungen Level 1 |
407 |
|
|
Index |
408 |
|