Bjarne Stroustrup
Die C++-Programmiersprache
aktuell zum C++11-Standard
Inhalt
6
Vorwort
32
Teil I Einführung
36
1 Vorbemerkungen
38
1.1?Zum Aufbau dieses Buchs
38
1.1.1?Einführung
39
1.1.2?Grundlegende Sprachmittel
39
1.1.3?Abstraktionsmechanismen
40
1.1.4?Die Standardbibliothek
42
1.1.5?Beispiele und Referenzen
43
1.2?Der Entwurf von C++
45
1.2.1?Programmierstile
47
1.2.2?Typprüfung
50
1.2.3?C-Kompatibilität
51
1.2.4?Sprache, Bibliotheken und Systeme
52
1.3?C++ lernen
54
1.3.1?In C++ programmieren
56
1.3.2?Ratschläge für C++-Programmierer
57
1.3.3?Ratschläge für C-Programmierer
58
1.3.4?Ratschläge für Java-Programmierer
59
1.4?Historische Anmerkungen
60
1.4.1?Chronik
61
1.4.2?Die frühen Jahre
62
1.4.2.1?Sprachfeatures und Bibliotheksinstrumente
63
1.4.3?Der 1998-Standard
65
1.4.3.1?Sprachfeatures
65
1.4.3.2?Die Standardbibliothek
66
1.4.4?Der 2011-Standard
67
1.4.4.1?Sprachfeatures
68
1.4.4.2?Standardbibliothek
69
1.4.5?Wofür wird C++ verwendet?
70
1.5?Ratschläge
72
1.6?Literaturhinweise
73
2 Ein Rundreise durch C++: Die Grundlagen
78
2.1?Einführung
78
2.2?Die Grundlagen
79
2.2.1?Hello, World!
79
2.2.2?Typen, Variablen und Arithmetik
81
2.2.3?Konstanten
83
2.2.4?Tests und Schleifen
84
2.2.5?Zeiger, Arrays und Schleifen
86
2.3?Benutzerdefinierte Typen
88
2.3.1?Strukturen
88
2.3.2?Klassen
90
2.3.3?Aufzählungen
92
2.4?Modularität
93
2.4.1?Separate Kompilierung
94
2.4.2?Namespaces
95
2.4.3?Fehlerbehandlung
96
2.4.3.1?Ausnahmen
97
2.4.3.2?Invarianten
98
2.4.3.3?Statische Assertionen
99
2.5?Nachbemerkung
100
2.6?Ratschläge
100
3 Eine Rundreise durch C++: Abstraktionsmechanismen
102
3.1?Einführung
102
3.2?Klassen
103
3.2.1?Konkrete Typen
103
3.2.1.1?Ein arithmetischer Typ
104
3.2.1.2?Ein Container
106
3.2.1.3?Container initialisieren
107
3.2.2?Abstrakte Typen
108
3.2.3?Virtuelle Funktionen
111
3.2.4?Klassenhierarchien
112
3.3?Kopieren und verschieben
116
3.3.1?Container kopieren
116
3.3.2?Container verschieben
118
3.3.3?Ressourcenverwaltung
120
3.3.4?Operationen unterdrücken
121
3.4?Templates
122
3.4.1?Parametrisierte Typen
122
3.4.2?Funktions-Templates
123
3.4.3?Funktionsobjekte
124
3.4.4?Variadische Templates
127
3.4.5?Alias
128
3.5?Ratschläge
129
4 Eine Rundreise durch C++: Container und Algorithmen
130
4.1?Bibliotheken
130
4.1.1?Überblick über die Standardbibliothek
131
4.1.2?Header und Namespace der Standardbibliothek
132
4.2?Strings
133
4.3?Stream-Ein-/Ausgabe
135
4.3.1?Ausgabe
135
4.3.2?Eingabe
136
4.3.3?Ein-/Ausgabe von benutzerdefinierten Typen
137
4.4?Container
139
4.4.1?vector
139
4.4.1.1?Elemente
141
4.4.1.2?Bereichsüberprüfung
141
4.4.2?list
142
4.4.3?map
144
4.4.4?unordered_map
145
4.4.5?Überblick über Container
145
4.5?Algorithmen
147
4.5.1?Iteratoren verwenden
148
4.5.2?Iteratortypen
150
4.5.3?Stream-Iteratoren
151
4.5.4?Prädikate
153
4.5.5?Überblick über Algorithmen
153
4.5.6?Containeralgorithmen
154
4.6?Ratschläge
155
5 Eine Rundreise durch C++: Nebenläufigkeit und Dienstprogramme
156
5.1?Einführung
156
5.2?Ressourcenverwaltung
156
5.2.1?unique_ptr und shared_ptr
157
5.3?Nebenläufigkeit
159
5.3.1?Tasks und Threads
160
5.3.2?Argumente übergeben
161
5.3.3?Ergebnisse zurückgeben
162
5.3.4?Daten gemeinsam nutzen
162
5.3.4.1?Warten auf Ereignisse
164
5.3.5?Kommunizierende Tasks
165
5.3.5.1?future und promise
166
5.3.5.2?packaged_task
167
5.3.5.3?async()
168
5.4?Kleine Hilfskomponenten
169
5.4.1?Zeit
169
5.4.2?Typfunktionen
170
5.4.2.1?iterator_traits
170
5.4.2.2?Typprädikate
172
5.4.3?pair und tuple
173
5.5?Reguläre Ausdrücke
174
5.6?Mathematik
175
5.6.1?Mathematische Funktionen und Algorithmen
175
5.6.2?Komplexe Zahlen
175
5.6.3?Zufallszahlen
176
5.6.4?Vektorarithmetik
178
5.6.5?Numerische Grenzen
179
5.7?Ratschläge
179
Teil II Grundlegende Sprachelemente
180
6 Typen und Deklarationen
182
6.1?Der ISO-C++-Standard
182
6.1.1?Implementierungen
184
6.1.2?Der grundlegende Quellzeichensatz
184
6.2?Typen
185
6.2.1?Fundamentale Typen
185
6.2.2?Boolesche Typen
186
6.2.3?Zeichentypen
188
6.2.3.1?Vorzeichenbehaftete und vorzeichenlose Zeichen
190
6.2.3.2?Zeichenliterale
191
6.2.4?Ganzzahltypen
193
6.2.4.1?Ganzzahlliterale
193
6.2.4.2?Typen von Ganzzahlliteralen
194
6.2.5?Gleitkommatypen
195
6.2.5.1?Gleitkommaliterale
195
6.2.6?Präfixe und Suffixe
196
6.2.7?void
197
6.2.8?Größen
197
6.2.9?Ausrichtung
200
6.3?Deklarationen
201
6.3.1?Die Struktur von Deklarationen
203
6.3.2?Mehrere Namen deklarieren
204
6.3.3?Namen
205
6.3.3.1?Schlüsselwörter
206
6.3.4?Gültigkeitsbereiche
207
6.3.5?Initialisierung
209
6.3.5.1?Fehlende Initialisierer
212
6.3.5.2?Initialisierungslisten
213
6.3.6?Einen Typ herleiten: auto und decltype()
214
6.3.6.1?Der Typspezifizierer auto
214
6.3.6.2?auto und {}-Listen
215
6.3.6.3?Der Spezifizierer decltype()
216
6.4?Objekte und Werte
217
6.4.1?L-Werte und R-Werte
217
6.4.2?Lebensdauer von Objekten
218
6.5?Typalias
219
6.6?Ratschläge
220
7 Zeiger, Arrays und Referenzen
222
7.1?Einführung
222
7.2?Zeiger
222
7.2.1?void*
223
7.2.2?nullptr
224
7.3?Arrays
225
7.3.1?Array-Initialisierer
226
7.3.2?Stringliterale
227
7.3.2.1?Rohe Zeichen-Strings
229
7.3.2.2?Größere Zeichensätze
230
7.4?Zeiger auf Arrays
231
7.4.1?Navigieren in Arrays
233
7.4.2?Mehrdimensionale Arrays
235
7.4.3?Arrays übergeben
236
7.5?Zeiger und const
238
7.6?Zeiger und Besitz
240
7.7?Referenzen
241
7.7.1?L-Wert-Referenzen
243
7.7.2?R-Wert-Referenzen
246
7.7.3?Referenzen auf Referenzen
249
7.7.4?Zeiger und Referenzen
250
7.8?Ratschläge
252
8 Strukturen, Unions und Aufzählungen
254
8.1?Einführung
254
8.2?Strukturen
254
8.2.1?Layout einer Struktur
256
8.2.2?Namen von Strukturen
257
8.2.3?Strukturen und Klassen
259
8.2.4?Strukturen und Arrays
260
8.2.5?Typäquivalenz
262
8.2.6?Plain Old Data
263
8.2.7?Felder
265
8.3?Unions
266
8.3.1?Unions und Klassen
268
8.3.2?Anonyme Unions
269
8.4?Aufzählungen
272
8.4.1?Aufzählungsklassen
272
8.4.2?Einfache Aufzählungen
276
8.4.3?Unbenannte Aufzählungen
278
8.5?Ratschläge
278
9 Anweisungen
280
9.1?Einführung
280
9.2?Zusammenfassung der Anweisungen
280
9.3?Deklarationen als Anweisungen
282
9.4?Auswahlanweisungen
283
9.4.1?if-Anweisungen
283
9.4.2?switch-Anweisungen
285
9.4.2.1?Deklarationen in case-Zweigen
287
9.4.3?Deklarationen in Bedingungen
287
9.5?Schleifenanweisungen
288
9.5.1?Bereichsbasierte for-Anweisungen
289
9.5.2?for-Anweisungen
290
9.5.3?while-Anweisungen
291
9.5.4?do-Anweisungen
292
9.5.5?Schleifen verlassen
292
9.6?goto-Anweisungen
293
9.7?Kommentare und Einrückungen
294
9.8?Ratschläge
296
10 Ausdrücke
298
10.1?Einführung
298
10.2?Ein Taschenrechner
298
10.2.1?Der Parser
299
10.2.2?Eingabe
303
10.2.3?Low-level-Eingabe
307
10.2.4?Fehlerbehandlung
309
10.2.5?Das Rahmenprogramm
309
10.2.6?Header
310
10.2.7?Befehlszeilenargumente
311
10.2.8?Eine Anmerkung zum Stil
312
10.3?Zusammenfassung der Operatoren
313
10.3.1?Ergebnisse
317
10.3.2?Reihenfolge der Auswertung
318
10.3.3?Operatorrangfolge
319
10.3.4?Temporäre Objekte
320
10.4?Konstante Ausdrücke
322
10.4.1?Symbolische Konstanten
324
10.4.2?const-Typen in konstanten Ausdrücken
325
10.4.3?Literale Typen
325
10.4.4?Referenzargumente
326
10.4.5?Adresse konstanter Ausdrücke
327
10.5?Implizite Typkonvertierung
327
10.5.1?Heraufstufungen
328
10.5.2?Konvertierungen
328
10.5.2.1?Integrale Konvertierungen
329
10.5.2.2?Gleitkommakonvertierungen
329
10.5.2.3?Zeiger- und Referenzkonvertierungen
330
10.5.2.4?Zeiger-auf-Member-Konvertierungen
330
10.5.2.5?Boolesche Konvertierungen
330
10.5.2.6?Gleitkomma-Ganzzahl-Konvertierungen
331
10.5.3?Übliche arithmetische Konvertierungen
332
10.6?Ratschläge
332
11 Auswahloperationen
334
11.1?Diverse Operatoren
334
11.1.1?Logische Operatoren
334
11.1.2?Bitweise logische Operatoren
334
11.1.3?Bedingte Ausdrücke
336
11.1.4?Inkrementieren und Dekrementieren
336
11.2?Freispeicher
338
11.2.1?Speicherverwaltung
340
11.2.2?Arrays
343
11.2.3?Speicherplatz beschaffen
344
11.2.4?Überladen von new
345
11.2.4.1?nothrow new
347
11.3?Listen
348
11.3.1?Implementierungsmodell
348
11.3.2?Qualifizierte Listen
350
11.3.3?Unqualifizierte Listen
350
11.4?Lambda-Ausdrücke
352
11.4.1?Implementierungsmodelle
353
11.4.2?Alternativen für Lambda-Ausdrücke
354
11.4.3?Erfassung
356
11.4.3.1?Lambda und Lebensdauer
358
11.4.3.2?Namen von Namespaces
359
11.4.3.3?Lambda und this
359
11.4.3.4?Veränderbare Lambda-Ausdrücke
359
11.4.4?Aufruf und Rückgabe
360
11.4.5?Der Typ eines Lambda-Ausdrucks
360
11.5?Explizite Typumwandlung
361
11.5.1?Konstruktion
363
11.5.2?Benannte Typumwandlungen
364
11.5.3?C-Typumwandlungen
366
11.5.4?Funktionale Typumwandlung
366
11.6?Ratschläge
367
12 Funktionen
368
12.1?Funktionsdeklarationen
368
12.1.1?Warum Funktionen?
369
12.1.2?Bestandteile einer Funktionsdeklaration
369
12.1.3?Funktionsdefinitionen
370
12.1.4?Werte zurückgeben
372
12.1.5?Inline-Funktionen
374
12.1.6?constexpr-Funktionen
375
12.1.6.1?constexpr und Referenzen
376
12.1.6.2?Bedingte Auswertung
377
12.1.7?[[noreturn]]-Funktionen
377
12.1.8?Lokale Variablen
378
12.2?Argumentübergabe
379
12.2.1?Referenzargumente
380
12.2.2?Array-Argumente
382
12.2.3?Listenargumente
384
12.2.4?Nicht angegebene Anzahl von Argumenten
385
12.2.5?Standardargumente
389
12.3?Überladene Funktionen
391
12.3.1?Automatische Auflösung von Überladungen
391
12.3.2?Überladen und Rückgabetyp
393
12.3.3?Überladen und Gültigkeitsbereiche
394
12.3.4?Auflösung für mehrere Argumente
395
12.3.5?Manuelle Auflösung von Überladungen
395
12.4?Vor- und Nachbedingungen
396
12.5?Zeiger auf Funktion
398
12.6?Makros
402
12.6.1?Bedingte Übersetzung
405
12.6.2?Vordefinierte Makros
406
12.6.3?Pragmas
407
12.7?Ratschläge
407
13 Ausnahmenbehandlung
410
13.1?Fehlerbehandlung
410
13.1.1?Ausnahmen
411
13.1.2?Herkömmliche Fehlerbehandlung
413
13.1.3?Durchhangeln
414
13.1.4?Alternative Ansichten von Ausnahmen
415
13.1.4.1?Asynchrone Ereignisse
415
13.1.4.2?Ausnahmen, die keine Fehler sind
415
13.1.5?Wann Sie keine Ausnahmen verwenden können
416
13.1.6?Hierarchische Fehlerbehandlung
417
13.1.7?Ausnahmen und Effizienz
419
13.2?Ausnahmegarantien
421
13.3?Ressourcenverwaltung
423
13.3.1?finally
426
13.4?Invarianten erzwingen
428
13.5?Ausnahmen auslösen und abfangen
433
13.5.1?Ausnahmen auslösen
433
13.5.1.1?noexcept-Funktionen
435
13.5.1.2?Der Operator noexcept
435
13.5.1.3?Ausnahmespezifikationen
436
13.5.2?Ausnahmen abfangen
437
13.5.2.1?Ausnahmen erneut auslösen
438
13.5.2.2?Jede Ausnahme abfangen
439
13.5.2.3?Mehrere Handler
440
13.5.2.4?try-Blöcke in Funktionen
440
13.5.2.5?Beendigung
442
13.5.3?Ausnahmen und Threads
444
13.6?Eine vector-Implementierung
445
13.6.1?Ein einfacher vector
445
13.6.2?Speicher explizit darstellen
449
13.6.3?Zuweisung
452
13.6.4?Größe ändern
454
13.6.4.1?reserve()
455
13.6.4.2?resize()
456
13.6.4.3?push_back()
456
13.6.4.4?Abschließende Gedanken
457
13.7?Ratschläge
458
14 Namespaces
460
14.1?Kompositionsprobleme
460
14.2?Namespaces
461
14.2.1?Explizite Qualifizierung
463
14.2.2?using-Deklarationen
464
14.2.3?using-Direktiven
465
14.2.4?Argumentabhängige Namensauflösung
466
14.2.5?Namespaces sind offen
469
14.3?Modularisierung und Schnittstellen
470
14.3.1?Namespaces als Module
471
14.3.2?Implementierungen
473
14.3.3?Schnittstellen und Implementierungen
475
14.4?Komposition mit Namespaces
477
14.4.1?Komfort vs. Sicherheit
477
14.4.2?Namespace-Alias
478
14.4.3?Namespaces zusammensetzen
479
14.4.4?Komposition und Auswahl
480
14.4.5?Namespaces und Überladen
481
14.4.6?Versionsverwaltung
483
14.4.7?Verschachtelte Namespaces
485
14.4.8?Unbenannte Namespaces
486
14.4.9?C-Header
487
14.5?Ratschläge
488
15 Quelldateien und Programme
490
15.1?Separate Übersetzung
490
15.2?Binden
491
15.2.1?Dateilokale Namen
494
15.2.2?Header-Dateien
495
15.2.3?Die Eine-Definition-Regel
497
15.2.4?Header der Standardbibliothek
499
15.2.5?Binden mit Nicht-C++-Code
500
15.2.6?Binden und Zeiger auf Funktionen
502
15.3?Header-Dateien verwenden
503
15.3.1?Organisation mit einzelnem Header
503
15.3.2?Organisation mit mehreren Header-Dateien
507
15.3.2.1?Andere Taschenrechnermodule
510
15.3.2.2?Header verwenden
512
15.3.3?Include-Wächter
513
15.4?Programme
514
15.4.1?Initialisierung von nichtlokalen Variablen
514
15.4.2?Initialisierung und Nebenläufigkeit
515
15.4.3?Programmbeendigung
516
15.5?Ratschläge
518
Teil III Abstraktionsmechanismen
520
16 Klassen
522
16.1?Einführung
522
16.2?Grundlagen von Klassen
523
16.2.1?Member-Funktionen
524
16.2.2?Standardmäßiges Kopieren
525
16.2.3?Zugriffskontrolle
526
16.2.4?class und struct
527
16.2.5?Konstruktoren
529
16.2.6?Explizite Konstruktoren
531
16.2.7?Klasseninterne Initialisierer
533
16.2.8?Klasseninterne Funktionsdefinitionen
534
16.2.9?Veränderlichkeit
535
16.2.9.1?Konstante Member-Funktionen
535
16.2.9.2?Physische und logische Konstanz
536
16.2.9.3?mutable
537
16.2.9.4?Veränderlichkeit über Indirektion
537
16.2.10?Selbstreferenz
538
16.2.11?Member-Zugriff
540
16.2.12?Statische Member
541
16.2.13?Member-Typen
543
16.3?Konkrete Klassen
544
16.3.1?Member-Funktionen
547
16.3.2?Hilfsfunktionen
550
16.3.3?Überladene Operatoren
551
16.3.4?Der Stellenwert von konkreten Klassen
552
16.4?Ratschläge
553
17 Konstruieren, Aufräumen, Kopieren und Verschieben
556
17.1?Einführung
556
17.2?Konstruktoren und Destruktoren
558
17.2.1?Konstruktoren und Invarianten
559
17.2.2?Destruktoren und Ressourcen
560
17.2.3?Basis- und Member-Destruktoren
561
17.2.4?Konstruktoren und Destruktoren aufrufen
562
17.2.5?Virtuelle Destruktoren
563
17.3?Initialisierung von Klassenobjekten
564
17.3.1?Initialisierung ohne Konstruktoren
564
17.3.2?Initialisierung mithilfe von Konstruktoren
566
17.3.2.1?Initialisierung durch Konstruktoren
568
17.3.3?Standardkonstruktoren
569
17.3.4?Initialisierungslisten-Konstruktoren
571
17.3.4.1?Mehrdeutigkeiten bei Initialisierungslisten-Konstruktoren auflösen
572
17.3.4.2?Initialisierungslisten verwenden
573
17.3.4.3?Direkte und Kopierinitialisierung
574
17.4 Initialisierung von Membern und Basisklassen
576
17.4.1?Member-Initialisierung
576
17.4.1.1?Member-Initialisierung und -Zuweisung
577
17.4.2?Basisklassen-Initialisierer
578
17.4.3?Konstruktoren delegieren
578
17.4.4?Klasseninterne Initialisierer
579
17.4.5?Initialisierer statischer Member
581
17.5?Kopieren und verschieben
582
17.5.1?Kopieren
583
17.5.1.1?Vorsicht vor Standardkonstruktoren
585
17.5.1.2?Kopieren von Basisklassen
585
17.5.1.3?Was Kopieren bedeutet
586
17.5.1.4?Slicing
589
17.5.2?Verschieben
590
17.6?Standardoperationen generieren
594
17.6.1?Explizite Standardoperationen
595
17.6.2?Standardoperationen
596
17.6.3?Standardoperationen verwenden
597
17.6.3.1?Standardkonstruktoren
597
17.6.3.2?Invarianten bewahren
597
17.6.3.3?Ressourceninvarianten
598
17.6.3.4?Partiell spezifizierte Invarianten
599
17.6.4?Gelöschte Funktionen
601
17.7?Ratschläge
603
18 Überladen von Operatoren
606
18.1?Einführung
606
18.2?Operatorfunktionen
608
18.2.1?Binäre und unäre Operatoren
609
18.2.2?Vordefinierte Bedeutungen für Operatoren
610
18.2.3?Operatoren und benutzerdefinierte Typen
611
18.2.4?Objekte übergeben
611
18.2.5?Operatoren in Namespaces
613
18.3?Ein Typ für komplexe Zahlen
615
18.3.1?Member- und Nicht-Member-Operatoren
615
18.3.2?Arithmetik mit gemischten Datentypen
616
18.3.3?Konvertierungen
617
18.3.3.1?Konvertierung von Operanden
619
18.3.4?Literale
620
18.3.5?Zugriffsfunktionen
621
18.3.6?Hilfsfunktionen
622
18.4?Typumwandlung
623
18.4.1?Konvertierungsoperatoren
623
18.4.2?Explizite Konvertierungsoperatoren
625
18.4.3?Mehrdeutigkeiten
626
18.5?Ratschläge
628
19 Spezielle Operatoren
630
19.1?Einführung
630
19.2?Spezielle Operatoren
630
19.2.1?Indizierung
630
19.2.2?Funktionsaufruf
631
19.2.3?Dereferenzieren
633
19.2.4?Inkrementieren und Dekrementieren
635
19.2.5?Allokation und Deallokation
637
19.2.6?Benutzerdefinierte Literale
639
19.3?Eine String-Klasse
642
19.3.1?Wesentliche Operationen
643
19.3.2?Zugriff auf Zeichen
643
19.3.3?Darstellung
644
19.3.3.1?Ergänzende Funktionen
646
19.3.4?Member-Funktionen
647
19.3.5?Hilfsfunktionen
650
19.3.6?Unsere String-Klasse verwenden
652
19.4?Friends
652
19.4.1?Friends finden
654
19.4.2?Friends und Member
655
19.5?Ratschläge
657
20 Abgeleitete Klassen
660
20.1?Einführung
660
20.2?Abgeleitete Klassen
661
20.2.1?Member-Funktionen
664
20.2.2?Konstruktoren und Destruktoren
665
20.3?Klassenhierarchien
666
20.3.1?Typfelder
666
20.3.2?Virtuelle Funktionen
669
20.3.3?Explizite Qualifizierung
672
20.3.4?Überschreiben steuern
672
20.3.4.1?override
674
20.3.4.2?final
675
20.3.5?Member der Basisklasse verwenden
677
20.3.5.1?Konstruktoren vererben
678
20.3.6?Lockerung bei Rückgabetypen
680
20.4?Abstrakte Klassen
682
20.5?Zugriffskontrolle
684
20.5.1?Geschützte Member
688
20.5.1.1?Geschützte Member verwenden
689
20.5.2?Zugriff auf Basisklassen
689
20.5.2.1?Mehrfachvererbung und Zugriffskontrolle
690
20.5.3?using-Deklarationen und Zugriffskontrolle
691
20.6?Zeiger auf Member
692
20.6.1?Zeiger auf Funktions-Member
692
20.6.2?Zeiger auf Daten-Member
694
20.6.3?Basis- und abgeleitete Member
695
20.7?Ratschläge
696
21 Klassenhierarchien
698
21.1?Einführung
698
21.2?Klassenhierarchien entwerfen
698
21.2.1?Implementierungsvererbung
699
21.2.1.1?Kritische Betrachtungen
702
21.2.2?Schnittstellenvererbung
703
21.2.3?Alternative Implementierungen
705
21.2.3.1?Kritische Betrachtungen
708
21.2.4?Objekterstellung örtlich begrenzen
709
21.3?Mehrfachvererbung
710
21.3.1?Mehrfachschnittstellen
711
21.3.2?Mehrere Implementierungsklassen
711
21.3.3?Auflösung von Mehrdeutigkeiten
713
21.3.4?Eine Basisklasse wiederholt verwenden
717
21.3.5?Virtuelle Basisklassen
718
21.3.5.1?Virtuelle Basisklassen konstruieren
721
21.3.5.2?Member einer virtuellen Klasse nur einmal aufrufen
722
21.3.6?Replizierte und virtuelle Basisklassen
724
21.3.6.1?Funktionen virtueller Basisklassen überschreiben
726
21.4?Ratschläge
727
22 Laufzeit-Typinformationen
728
22.1?Einführung
728
22.2?Navigation in der Klassenhierarchie
728
22.2.1?dynamic_cast
730
22.2.1.1?dynamic_cast in Referenz
732
22.2.2?Mehrfachvererbung
733
22.2.3?static_cast und dynamic_cast
735
22.2.4?Eine Schnittstelle zurückgewinnen
736
22.3?Doppelte Bindung und Besucher
740
22.3.1?Doppelte Bindung
741
22.3.2?Besucher
743
22.4?Konstruktion und Destruktion
745
22.5?Typidentifizierung
746
22.5.1?Erweiterte Typinformationen
748
22.6?RTTI – richtig und falsch eingesetzt
749
22.7?Ratschläge
751
23 Templates
754
23.1?Einführung und Überblick
754
23.2?Ein einfaches String-Template
757
23.2.1?Ein Template definieren
759
23.2.2?Template-Instanziierung
760
23.3?Typprüfung
761
23.3.1?Typäquivalenz
763
23.3.2?Fehlererkennung
764
23.4?Member von Klassen-Templates
765
23.4.1?Daten-Member
765
23.4.2?Member-Funktionen
766
23.4.3?Member-Typalias
766
23.4.4?Statische Member
767
23.4.5?Member-Typen
767
23.4.6?Member-Templates
768
23.4.6.1?Templates und Konstruktoren
769
23.4.6.2?Templates und virtual
770
23.4.6.3?Verschachtelungen
770
23.4.7?Friends
773
23.5?Funktions-Templates
774
23.5.1?Argumente von Funktions-Templates
776
23.5.2?Funktions-Template-Argumente herleiten
777
23.5.2.1?Referenzherleitung
778
23.5.3?Überladen von Funktions-Templates
780
23.5.3.1?Mehrdeutigkeiten auflösen
781
23.5.3.2?Fehler bei Argumentersetzung
782
23.5.3.3?Überladen und Ableitung
784
23.5.3.4?Überladen und nicht hergeleitete Parameter
784
23.6?Template-Alias
785
23.7?Quellcodeorganisation
786
23.7.1?Binden
788
23.8?Ratschläge
789
24 Generische Programmierung
792
24.1?Einführung
792
24.2?Algorithmen und Lifting
793
24.3?Konzepte
797
24.3.1?Ein Konzept erkennen
798
24.3.2?Konzepte und Einschränkungen
801
24.4?Konzepte konkret machen
803
24.4.1?Axiome
807
24.4.2?Konzepte mit mehreren Argumenten
808
24.4.3?Wertkonzepte
810
24.4.4?Einschränkungsüberprüfungen
810
24.4.5?Überprüfung von Template-Definitionen
812
24.5?Ratschläge
814
25 Spezialisierung
816
25.1?Einführung
816
25.2?Template-Parameter und -Argumente
817
25.2.1?Typen als Argumente
817
25.2.2?Werte als Argumente
819
25.2.3?Operationen als Argumente
821
25.2.4?Templates als Argumente
823
25.2.5?Template-Standardargumente
824
25.2.5.1?Standardargumente bei Funktions-Templates
825
25.3?Spezialisierung
826
25.3.1?Schnittstellenspezialisierung
829
25.3.1.1?Implementierungsspezialisierung
830
25.3.2?Das primäre Template
830
25.3.3?Reihenfolge der Spezialisierung
832
25.3.4?Funktions-Template-Spezialisierung
833
25.3.4.1?Spezialisierung und Überladen
833
25.3.4.2?Spezialisierung, die kein Überladen ist
834
25.4?Ratschläge
835
26 Instanziierung
836
26.1?Einführung
836
26.2?Template-Instanziierung
837
26.2.1?Wann wird Instanziierung gebraucht?
838
26.2.2?Manuelle Kontrolle der Instanziierung
839
26.3?Namensbindung
840
26.3.1?Abhängige Namen
842
26.3.2?Bindung am Punkt der Definition
844
26.3.3?Bindung am Punkt der Instanziierung
845
26.3.4?Mehrere Punkte der Instanziierung
847
26.3.5?Templates und Namespaces
849
26.3.6?Zu aggressive ADL
850
26.3.7?Namen aus Basisklassen
852
26.4?Ratschläge
854
27 Templates und Hierarchien
856
27.1?Einführung
856
27.2?Parametrisierung und Hierarchie
857
27.2.1?Generierte Typen
859
27.2.2?Template-Konvertierungen
861
27.3?Hierarchien von Klassen-Templates
862
27.3.1?Templates als Schnittstellen
864
27.4?Template-Parameter als Basisklassen
864
27.4.1?Datenstrukturen zusammensetzen
865
27.4.2?Klassenhierarchien linearisieren
869
27.5?Ratschläge
874
28 Metaprogrammierung
876
28.1?Einführung
876
28.2?Typfunktionen
878
28.2.1?Typalias
881
28.2.1.1?Wann man keinen Alias verwendet
882
28.2.2?Typprädikate
883
28.2.3?Eine Funktion auswählen
885
28.2.4?Traits
885
28.3?Steuerungsstrukturen
887
28.3.1?Auswahl
887
28.3.1.1?Zwischen zwei Typen auswählen
888
28.3.1.2?Übersetzungszeit versus Laufzeit
888
28.3.1.3?Zwischen mehreren Typen auswählen
890
28.3.2?Iteration und Rekursion
891
28.3.2.1?Rekursion mit Klassen
892
28.3.3?Wann man Metaprogrammierung verwendet
892
28.4?Bedingte Definition: Enable_if
894
28.4.1?Enable_if verwenden
895
28.4.2?Enable_if implementieren
897
28.4.3?Enable_if und Konzepte
898
28.4.4?Weitere Beispiele mit Enable_if
898
28.5?Eine Liste zur Übersetzungszeit: Tuple
901
28.5.1?Eine einfache Ausgabefunktion
903
28.5.2?Elementzugriff
904
28.5.2.1?Konstante Tupel
906
28.5.3?make_tuple
907
28.6?Variadische Templates
908
28.6.1?Eine typsichere printf()-Funktion
908
28.6.2?Technische Details
911
28.6.3?Weiterleitung
913
28.6.4?Der Typ tuple der Standardbibliothek
914
28.7?Beispiel: SI-Einheiten
918
28.7.1?Einheiten
918
28.7.2?Größen
919
28.7.3?Literale für Einheiten
921
28.7.4?Hilfsfunktionen
923
28.8?Ratschläge
924
29 Ein Matrix-Design
926
29.1?Einführung
926
29.1.1?Einfache Anwendungen von Matrix
926
29.1.2?Anforderungen an Matrix
928
29.2?Ein Matrix-Template
929
29.2.1?Konstruktion und Zuweisung
931
29.2.2?Indizierung und Slicing
932
29.3?Arithmetische Matrix-Operationen
935
29.3.1?Skalaroperationen
936
29.3.2?Addition
936
29.3.3?Multiplikation
938
29.4?Matrix-Implementierung
940
29.4.1?slice()
940
29.4.2?Matrix-Slices
940
29.4.3?Matrix_ref
942
29.4.4?Matrix-Listeninitialisierung
943
29.4.5?Matrix-Zugriff
945
29.4.6?Nulldimensionale Matrix
948
29.5?Lineare Gleichungen lösen
949
29.5.1?Das klassische gaußsche Eliminationsverfahren
950
29.5.2?Pivotisierung
951
29.5.3?Testen
952
29.5.4?Verschmolzene Operationen
953
29.6?Ratschläge
956
Teil IVDie Standardbibliothek
958
30 Überblick über die Standardbibliothek
960
30.1?Einführung
960
30.1.1?Komponenten der Standardbibliothek
961
30.1.2?Designeinschränkungen
962
30.1.3?Beschreibungsstil
964
30.2?Header
964
30.3?Sprachunterstützung
969
30.3.1?Unterstützung für Initialisierungslisten
969
30.3.2?Unterstützung für bereichsbasierte for-Anweisung
970
30.4?Fehlerbehandlung
970
30.4.1?Ausnahmen
971
30.4.1.1?Die Hierarchie der Standardausnahmen
972
30.4.1.2?Weiterleitung von Ausnahmen
973
30.4.1.3?terminate()
976
30.4.2?Assertionen
976
30.4.3?system_error
977
30.4.3.1?Fehlercodes
978
30.4.3.2?Fehlerkategorien
980
30.4.3.3?system_error-Ausnahme
981
30.4.3.4?Potenziell portable Fehlerbedingungen
982
30.4.3.5?Fehlercodes zuordnen
982
30.4.3.6?errc-Fehlercodes
984
30.4.3.7?future_errc-Fehlercodes
987
30.4.3.8?io_errc-Fehlercodes
987
30.5?Ratschläge
987
31 STL-Container
990
31.1?Einführung
990
31.2?Überblick über Container
990
31.2.1?Containerdarstellung
993
31.2.2?Anforderungen an die Elemente
995
31.2.2.1?Vergleiche
996
31.2.2.2?Andere relationale Operatoren
997
31.3?Operatoren im Überblick
998
31.3.1?Member-Typen
1001
31.3.2?Konstruktoren, Destruktor und Zuweisungen
1002
31.3.3?Größe und Kapazität
1004
31.3.4?Iteratoren
1004
31.3.5?Elementzugriff
1006
31.3.6?Stack-Operationen
1006
31.3.7?Listenoperationen
1007
31.3.8?Andere Operationen
1008
31.4?Container
1009
31.4.1?vector
1009
31.4.1.1?vector und Wachstum
1009
31.4.1.2?vector und Verschachtelung
1011
31.4.1.3?vector und Arrays
1013
31.4.1.4?vector und string
1013
31.4.2?Listen
1014
31.4.3?Assoziative Container
1016
31.4.3.1?Geordnete assoziative Container
1017
31.4.3.2?Ungeordnete assoziative Container
1021
31.4.3.3?Ungeordnete Maps konstruieren
1022
31.4.3.4?Hash- und Gleichheitsfunktionen
1024
31.4.3.5?Lastfaktor und Buckets
1027
31.5?Containeradapter
1028
31.5.1?stack
1029
31.5.2?queue
1031
31.5.3?priority_queue
1031
31.6?Ratschläge
1032
32 STL-Algorithmen
1036
32.1?Einführung
1036
32.2?Algorithmen
1036
32.2.1?Sequenzen
1037
32.3?Richtlinienargumente
1038
32.3.1?Komplexität
1040
32.4 Nichtmodifizierende Sequenzalgorithmen
1041
32.4.1?for_each()
1041
32.4.2?Sequenzprädikate
1041
32.4.3?count()
1042
32.4.4?find()
1042
32.4.5?equal() und mismatch()
1043
32.4.6?search()
1044
32.5?Modifizierende Sequenzalgorithmen
1045
32.5.1?copy()
1046
32.5.2?unique()
1047
32.5.3?remove(), reverse() und replace()
1048
32.5.4?rotate(), random_shuffle() und partition()
1049
32.5.5?Permutationen
1050
32.5.6?fill()
1051
32.5.7?swap()
1052
32.6?Sortieren und Suchen
1053
32.6.1?Binäre Suche
1056
32.6.2?merge()
1057
32.6.3?Mengenalgorithmen
1058
32.6.4?Heaps
1059
32.6.5?lexicographical_compare()
1061
32.7?Minimum und Maximum
1061
32.8?Ratschläge
1063
33 STL-Iteratoren
1064
33.1?Einführung
1064
33.1.1?Iteratormodell
1064
33.1.2?Iteratorkategorien
1066
33.1.3?Iterator-Traits
1067
33.1.4?Iteratoroperationen
1070
33.2?Iteratoradapter
1071
33.2.1?Reverse-Iteratoren
1071
33.2.2?Einfügeiteratoren
1074
33.2.3?Verschiebeiteratoren
1075
33.3?Bereichszugriffsfunktionen
1076
33.4?Funktionsobjekte
1077
33.5?Funktionsadapter
1078
33.5.1?bind()
1079
33.5.2?mem_fn()
1081
33.5.3?function
1081
33.6?Ratschläge
1084
34 Speicher und Ressourcen
1086
34.1?Einführung
1086
34.2?„Beinahe-Container“
1086
34.2.1?array
1087
34.2.2?bitset
1090
34.2.2.1?Konstruktoren
1091
34.2.2.2?bitset-Operationen
1093
34.2.3?vector
1095
34.2.4?Tupel
1096
34.2.4.1?pair
1096
34.2.4.2?tuple
1098
34.3?Ressourcenverwaltungszeiger
1100
34.3.1?unique_ptr
1101
34.3.2?shared_ptr
1104
34.3.3?weak_ptr
1108
34.4?Allokatoren
1111
34.4.1?Der Standard-Allokator
1112
34.4.2?Allokator-Traits
1114
34.4.3?Zeiger-Traits
1115
34.4.4?Allokatoren mit eigenem Gültigkeitsbereich
1115
34.5?Die Schnittstelle zur Garbage Collection
1117
34.6?Nichtinitialisierter Speicher
1120
34.6.1?Temporäre Puffer
1121
34.6.2?raw_storage_iterator
1121
34.7?Ratschläge
1123
35 Utilities
1124
35.1?Einführung
1124
35.2?Zeit
1124
35.2.1?duration
1125
35.2.2?time_point
1128
35.2.3?Zeitgeber
1130
35.2.4?Zeit-Traits
1131
35.3 Rationale Arithmetik zur Übersetzungszeit
1132
35.4?Typfunktionen
1134
35.4.1?Typ-Traits
1134
35.4.2?Typgeneratoren
1139
35.5?Kleinere Utilities
1144
35.5.1?move() and forward()
1144
35.5.2?swap()
1145
35.5.3?Relationale Operatoren
1146
35.5.4?Vergleichen und Hashing von type_info
1147
35.6?Ratschläge
1148
36 Strings
1150
36.1?Einführung
1150
36.2?Zeichenklassifizierung
1150
36.2.1?Klassifizierungsfunktionen
1150
36.2.2?Zeichen-Traits
1152
36.3?Strings
1153
36.3.1?string im Vergleich zu C-Strings
1154
36.3.2?Konstruktoren
1156
36.3.3?Fundamentale Operationen
1158
36.3.4?String-Ein-/Ausgabe
1160
36.3.5?Numerische Konvertierungen
1160
36.3.6?STL-ähnliche Operationen
1162
36.3.7?Die find-Familie
1165
36.3.8?Teilstrings
1167
36.4?Ratschläge
1168
37 Reguläre Ausdrücke
1170
37.1?Reguläre Ausdrücke
1170
37.1.1?Notation regulärer Ausdrücke
1171
37.2?regex
1176
37.2.1?Übereinstimmungsergebnisse
1178
37.2.2?Formatierung
1181
37.3?Funktionen für reguläre Ausdrücke
1182
37.3.1?regex_match()
1182
37.3.2?regex_search()
1184
37.3.3?regex_replace()
1185
37.4?Iteratoren für reguläre Ausdrücke
1187
37.4.1?regex_iterator
1187
37.4.2?regex_token_iterator
1188
37.5?regex_traits
1191
37.6?Ratschläge
1192
38 E/A-Streams
1194
38.1?Einführung
1194
38.2?Die E/A-Stream-Hierarchie
1196
38.2.1?Datei-Streams
1197
38.2.2?String-Streams
1199
38.3?Fehlerbehandlung
1201
38.4?Ein-/Ausgabeoperationen
1203
38.4.1?Eingabeoperationen
1203
38.4.1.1?Formatierte Eingabe
1204
38.4.1.2?Unformatierte Eingabe
1205
38.4.2?Ausgabeoperationen
1206
38.4.2.1?Virtuelle Ausgabefunktionen
1208
38.4.3?Manipulatoren
1209
38.4.4?Stream-Status
1210
38.4.5?Formatierung
1214
38.4.5.1?Formatierungsstatus
1215
38.4.5.2?Standardmanipulatoren
1217
38.4.5.3?Benutzerdefinierte Manipulatoren
1220
38.5?Stream-Iteratoren
1222
38.6?Puffer
1223
38.6.1?Ausgabe-Streams und -puffer
1227
38.6.2?Eingabe-Streams und -puffer
1228
38.6.3?Pufferiteratoren
1229
38.6.3.1?istreambuf_iterator
1230
38.6.3.2?ostreambuf_iterator
1231
38.7?Ratschläge
1231
39 Locales
1234
39.1?Kulturelle Unterschiede behandeln
1234
39.2?Die Klasse locale
1237
39.2.1?Benannte Locales
1239
39.2.1.1?Neue Locales konstruieren
1242
39.2.2?Strings vergleichen
1243
39.3?Die Klasse facet
1244
39.3.1?Auf Facetten in einem Locale zugreifen
1245
39.3.2?Eine einfache benutzerdefinierte Facette
1246
39.3.3?Locales und Facetten verwenden
1249
39.4?Standardfacetten
1250
39.4.1?String-Vergleich
1252
39.4.1.1?Benannte collate-Facetten
1255
39.4.2?Numerische Formatierung
1255
39.4.2.1?Numerische Interpunktion
1256
39.4.2.2?Numerische Ausgabe
1257
39.4.2.3?Numerische Eingabe
1260
39.4.3?Formatierung von Geldbeträgen
1261
39.4.3.1?Interpunktion bei Geldbeträgen
1262
39.4.3.2?Ausgabe von Geldbeträgen
1265
39.4.3.3?Eingabe von Geldbeträgen
1266
39.4.4?Datum und Uhrzeit formatieren
1267
39.4.4.1?time_put
1267
39.4.4.2?time_get
1268
39.4.5?Zeichenklassifizierung
1270
39.4.6?Zeichencodes konvertieren
1274
39.4.7?Meldungen
1278
39.4.7.1?Meldungen von anderen Facetten verwenden
1281
39.5?Komfortschnittstellen
1282
39.5.1?Zeichenklassifizierung
1282
39.5.2?Zeichenkonvertierungen
1283
39.5.3?String-Konvertierungen
1283
39.5.4?Pufferkonvertierungen
1285
39.6?Ratschläge
1285
40 Numerische Berechnungen
1288
40.1?Einführung
1288
40.2?Numerische Grenzen
1288
40.2.1?Makros für Grenzwerte
1291
40.3?Mathematische Standardfunktionen
1292
40.4?Komplexe Zahlen
1294
40.5?Ein numerisches Array: valarray
1295
40.5.1?Konstruktoren und Zuweisungen
1296
40.5.2?Indizierung
1298
40.5.3?Operationen
1299
40.5.4?Slices
1302
40.5.5?slice_array
1304
40.5.6?Verallgemeinerte Slices
1305
40.6 Verallgemeinerte numerische Algorithmen
1306
40.6.1?accumulate()
1307
40.6.2?inner_product()
1308
40.6.3?partial_sum() und adjacent_difference()
1309
40.6.4?iota()
1310
40.7?Zufallszahlen
1310
40.7.1?Zufallszahlenmodule
1313
40.7.2?Zufallsgerät
1315
40.7.3?Verteilungen
1316
40.7.4?Zufallszahlen im Stil von C
1320
40.8?Ratschläge
1321
41 Nebenläufigkeit
1322
41.1?Einführung
1322
41.2?Speichermodelle
1324
41.2.1?Speicherstellen
1325
41.2.2?Umordnung von Befehlen
1326
41.2.3?Speicherordnung
1327
41.2.4?Data Races
1328
41.3?Atomare Datentypen
1330
41.3.1?Atomare Typen
1333
41.3.2?Flags und Fences
1338
41.3.3?Atomare Flags
1338
41.3.3.1?Fences
1339
41.4?volatile
1339
41.5?Ratschläge
1340
42 Threads und Tasks
1342
42.1?Einführung
1342
42.2?Threads
1342
42.2.1?Identität
1344
42.2.2?Konstruktion
1345
42.2.3?Zerstörung
1346
42.2.4?join()
1347
42.2.5?detach()
1348
42.2.6?Namespace this_thread
1350
42.2.7?Einen Thread vorzeitig beenden
1351
42.2.8?thread_local-Daten
1351
42.3?Data Races vermeiden
1353
42.3.1?Mutexe
1354
42.3.1.1?mutex und recursive_mutex
1355
42.3.1.2?mutex-Fehler
1357
42.3.1.3?timed_mutex und recursive_timed_mutex
1358
42.3.1.4?lock_guard und unique_lock
1359
42.3.2?Mehrere Sperren
1363
42.3.3?call_once()
1364
42.3.4?Bedingungsvariablen
1365
42.3.4.1?condition_variable_any
1370
42.4?Task-basierte Nebenläufigkeit
1371
42.4.1?future und promise
1372
42.4.2?promise
1373
42.4.3?packaged_task
1374
42.4.4?future
1377
42.4.5?shared_future
1380
42.4.6?async()
1381
42.4.7?Ein paralleles find()-Beispiel
1384
42.5?Ratschläge
1388
43 Die C-Standardbibliothek
1390
43.1?Einführung
1390
43.2?Dateien
1390
43.3?Die printf()-Familie
1391
43.4?C-Strings
1396
43.5?Speicher
1397
43.6?Datum und Uhrzeit
1399
43.7?Diverses
1402
43.8?Ratschläge
1404
44 Kompatibilität
1406
44.1?Einführung
1406
44.2?C++11-Erweiterungen
1407
44.2.1?Sprachfeatures
1407
44.2.2?Komponenten der Standardbibliothek
1408
44.2.3?Veraltete Features
1409
44.2.4?Umgang mit älteren C++-Implementierungen
1410
44.3?C/C++-Kompatibilität
1411
44.3.1?C und C++ sind Geschwister
1411
44.3.2?„Stillschweigende“ Unterschiede
1413
44.3.3?C-Code, der kein C++ ist
1414
44.3.3.1?Probleme mit „klassischem C“
1417
44.3.3.2?C-Features, die von C++ nicht übernommen wurden
1417
44.3.4?C++-Code, der kein C ist
1417
44.4?Ratschläge
1419
Index
1422
© 2009-2024 ciando GmbH