| |
| Inhaltsverzeichnis |
| |
| Vorwort | 17 |
| |
| Kapitel 1 Erste Schritte | 21 |
| | 1.1 | Ein einfaches C++-Programm schreiben | 22 |
| | | 1.1.1 | Das Programm kompilieren und ausführen | 23 |
| | 1.2 | Ein erster Blick auf die EinAusgabe | 26 |
| | | 1.2.1 | Standardmäßige EinAusgabe-Objekte | 26 |
| | | 1.2.2 | Verwendung der E/A-Bibliothek | 26 |
| | 1.3 | Ein Hinweis zu Kommentaren | 30 |
| | 1.4 | Kontrollstrukturen | 32 |
| | | 1.4.1 | Die while-Anweisung | 32 |
| | | 1.4.2 | Die for-Anweisung | 35 |
| | | 1.4.3 | Die if-Anweisung | 38 |
| | | 1.4.4 | Eine unbekannte Anzahl von Eingaben lesen | 40 |
| | 1.5 | Einführung in Klassen | 42 |
| | | 1.5.1 | Die Klasse Sales_item | 42 |
| | | 1.5.2 | Ein erster Blick auf Elementfunktionen | 45 |
| | 1.6 | Das fertige C++-Programm | 47 |
| |
| Teil I Die Grundlagen | 55 |
| |
| Kapitel 2 Variablen und grundlegende Typen | 57 |
| | 2.1 | Elementare Typen | 58 |
| | | 2.1.1 | Integrale Typen | 58 |
| | | 2.1.2 | Fließkommatypen | 61 |
| | 2.2 | Literale Konstanten | 62 |
| | | 2.2.1 | Regeln für Integerliterale | 62 |
| | 2.3 | Variablen | 69 |
| | | 2.3.1 | Was ist eine Variable? | 70 |
| | | 2.3.2 | Variablennamen | 72 |
| | | 2.3.3 | Objekte definieren | 74 |
| | | 2.3.4 | Regeln zur Initialisierung von Variablen | 77 |
| | | 2.3.5 | Deklarationen und Definitionen | 79 |
| | | 2.3.6 | Der Gültigkeitsbereich eines Namens | 80 |
| | | 2.3.7 | Variablen dort definieren, wo sie gebraucht werden | 82 |
| | | 2.3.8 | Der Qualifizierer const | 83 |
| | | 2.3.9 | Referenzen | 86 |
| | | 2.3.10 | Typedef-Namen | 89 |
| | | 2.3.11 | Aufzählungen | 90 |
| | | 2.3.12 | Klassentypen | 91 |
| | | 2.3.13 | Eigene Headerdateien schreiben | 95 |
| | | 2.9.1 | Eigene Header entwerfen | 96 |
| | | 2.9.2 | Einführung in den Präprozessor | 99 |
| |
| Kapitel 3 Typen der Bibliothek | 107 |
| | 3.1 | Using-Deklarationen | 108 |
| | 3.2 | Der Bibliothekstyp string | 110 |
| | | 3.2.1 | Strings definieren und initialisieren | 110 |
| | | 3.2.2 | Strings lesen und schreiben | 111 |
| | | 3.2.3 | Operationen mit Strings | 114 |
| | | 3.2.4 | Umgang mit den Zeichen eines Strings | 119 |
| | 3.3 | Der Bibliothekstyp vector | 121 |
| | | 3.3.1 | Vektoren definieren und initialisieren | 122 |
| | | 3.3.2 | Operationen mit Vektoren | 124 |
| | 3.4 | Einführung in Iteratoren | 127 |
| | | 3.4.1 | Iteratorarithmetik | 132 |
| | 3.5 | Der Bibliothekstyp bitset | 133 |
| | | 3.5.1 | Bitsets definieren und initialisieren | 133 |
| | | 3.5.2 | Operationen mit Bitsets | 136 |
| |
| Kapitel 4 Arrays und Zeiger | 143 |
| | 4.1 | Arrays | 144 |
| | | 4.1.1 | Arrays definieren und initialisieren | 144 |
| | | 4.1.2 | Operationen mit Arrays | 148 |
| | 4.2 | Einführung in Zeiger | 149 |
| | | 4.2.1 | Was ist ein Zeiger? | 149 |
| | | 4.2.2 | Zeiger definieren und initialisieren | 150 |
| | | 4.2.3 | Operationen mit Zeigern | 155 |
| | | 4.2.4 | Zeiger für den Zugriff auf Arrayelemente nutzen | 158 |
| | | 4.2.5 | Zeiger und der Qualifizierer const | 162 |
| | 4.3 | Zeichenstrings im C-Stil | 166 |
| | | 4.3.1 | Dynamisch zugewiesene Arrays | 171 |
| | | 4.3.2 | Schnittstellen zu älterem Code | 176 |
| | 4.4 | Mehrdimensionale Arrays | 178 |
| | | 4.4.1 | Zeiger und mehrdimensionale Arrays | 180 |
| |
| Kapitel 5 Ausdrücke | 185 |
| | 5.1 | Arithmetische Operatoren | 187 |
| | 5.2 | Relationale und logische Operatoren | 190 |
| | 5.3 | Bitweise Operatoren | 194 |
| | | 5.3.1 | Bitsetobjekte oder integrale Werte verwenden | 196 |
| | | 5.3.2 | Shift-Operatoren für die EinAusgabe | 198 |
| | 5.4 | Zuweisungsoperatoren | 199 |
| | | 5.4.1 | Die Zuweisung ist rechtsassoziativ | 199 |
| | | 5.4.2 | Die Zuweisung hat niedrige Priorität | 200 |
| | | 5.4.3 | Zusammengesetzte Zuweisungsoperatoren | 202 |
| | 5.5 | Inkrement- und Dekrementoperatoren | 203 |
| | 5.6 | Der Pfeiloperator | 205 |
| | 5.7 | Der bedingte Operator | 206 |
| | 5.8 | Der Operator sizeof | 208 |
| | 5.9 | Der Kommaoperator | 209 |
| | 5.10 | Zusammengesetzte Ausdrücke auswerten | 210 |
| | | 5.10.1 | Priorität | 210 |
| | | 5.10.2 | Assoziativität | 211 |
| | | 5.10.3 | Reihenfolge der Auswertung | 215 |
| | 5.11 | Die Ausdrücke new und delete | 217 |
| | 5.12 | Typkonvertierungen | 222 |
| | | 5.12.1 | Implizite Typkonvertierungen | 223 |
| | | 5.12.2 | Arithmetische Konvertierungen | 224 |
| | | 5.12.3 | Andere implizite Konvertierungen | 226 |
| | | 5.12.4 | Explizite Konvertierungen | 228 |
| | | 5.12.5 | Sinnvolle explizite Konvertierungen | 228 |
| | | 5.12.6 | Benannte explizite Konvertierungen | 229 |
| | | 5.12.7 | Explizite Konvertierungen im alten Stil | 231 |
| |
| Kapitel 6 Anweisungen | 237 |
| | 6.1 | Einfache Anweisungen | 238 |
| | 6.2 | Deklarationsanweisungen | 239 |
| | 6.3 | Zusammengesetzte Anweisungen (Blöcke) | 239 |
| | 6.4 | Der Gültigkeitsbereich von Anweisungen | 241 |
| | 6.5 | Die if-Anweisung | 242 |
| | | 6.5.1 | Der else-Zweig der if-Anweisung | 243 |
| | 6.6 | Die switch-Anweisung | 246 |
| | | 6.6.1 | switch-Anweisungen verwenden | 247 |
| | | 6.6.2 | Flusssteuerung innerhalb einer switch-Anweisung | 248 |
| | | 6.6.3 | Das default-Label | 250 |
| | | 6.6.4 | switch-Ausdrücke und case-Labels | 251 |
| | | 6.6.5 | Variablendefinitionen innerhalb einer switch-Anweisung | 251 |
| | 6.7 | Die while-Anweisung | 252 |
| | 6.8 | Die for-Anweisung | 255 |
| | | 6.8.1 | Teile des for-Headers auslassen | 257 |
| | | 6.8.2 | Mehrfache Definitionen im for-Header | 258 |
| | 6.9 | Die do.. .while-Anweisung | 259 |
| | 6.10 | Die break-Anweisung | 261 |
| | 6.11 | Die continue-Anweisung | 263 |
| | 6.12 | Die goto-Anweisung | 263 |
| | 6.13 | try-Blöcke und Ausnahmebehandlung | 265 |
| | | 6.13.1 | Ein throw-Ausdruck | 266 |
| | | 6.13.2 | Der try-Block | 266 |
| | | 6.13.3 | Standardausnahmen | 269 |
| | 6.14 | Den Präprozessor zum Debugging einsetzen | 270 |
| |
| Kapitel 7 Funktionen | 277 |
| | 7.1 | Funktionen definieren | 278 |
| | | 7.1.1 | Der Rückgabetyp einer Funktion | 279 |
| | | 7.1.2 | Die Parameterliste einer Funktion | 280 |
| | 7.2 | Argumentübergabe | 282 |
| | | 7.2.1 | Wertparameter | 282 |
| | | 7.2.2 | Referenzparameter | 285 |
| | | 7.2.3 | vector und andere Containerparameter | 291 |
| | | 7.2.4 | Arrayparameter | 292 |
| | | 7.2.5 | An Funktionen übergebene Arrays verwalten | 296 |
| | | 7.2.6 | Befehlszeilenoptionen in main | 298 |
| | | 7.2.7 | Funktionen mit variablen Parametern | 299 |
| | 7.3 | Die return-Anweisung | 299 |
| | | 7.3.1 | Funktionen ohne Rückgabewert | 300 |
| | | 7.3.2 | Funktionen mit Rückgabewert | 301 |
| | | 7.3.3 | Rekursion | 305 |
| | 7.4 | Funktionsdeklarationen | 307 |
| | | 7.4.1 | Standardargumente | 308 |
| | 7.5 | Lokale Objekte | 310 |
| | | 7.5.1 | Automatische Objekte | 311 |
| | | 7.5.2 | Statische lokale Objekte | 311 |
| | 7.6 | Inline-Funktionen | 312 |
| | 7.7 | Elementfunktionen einer Klasse | 315 |
| | | 7.7.1 | Den Rumpf einer Elementfunktion definieren | 315 |
| | | 7.7.2 | Elementfunktionen außerhalb der Klasse definieren | 318 |
| | | 7.7.3 | Den Konstruktor von Sales_item schreiben | 319 |
| | | 7.7.4 | Gliedern von Klassencodedateien | 322 |
| | 7.8 | Überladene Funktionen | 322 |
| | | 7.8.1 | Überladung und Gültigkeitsbereich | 325 |
| | | 7.8.2 | Funktionsübereinstimmung und Argumentkonvertierung | 327 |
| | | 7.8.3 | Die drei Schritte der Überladungsauflösung | 328 |
| | | 7.8.4 | Konvertierung von Argumenttypen | 331 |
| | 7.9 | Zeiger auf Funktionen | 336 |
| |
| Kapitel 8 Die E/A-Bibliothek | 343 |
| | 8.1 | Eine objektorientierte Bibliothek | 344 |
| | 8.2 | Status | 348 |
| | 8.3 | Den Ausgabepuffer verwalten | 352 |
| | 8.4 | Dateiein- und -ausgäbe | 354 |
| | | 8.4.1 | Dateistreamobjekte verwenden | 355 |
| | | 8.4.2 | Dateimodi | 358 |
| | | 8.4.3 | Ein Programm zum Öffnen und Überprüfen von Eingabedateien | 361 |
| | 8.5 | Stringstreams | 362 |
| |
| Teil II Container und Algorithmen | 369 |
| |
| Kapitel 9 Sequenzielle Container | 371 |
| | 9.1 | Sequenzielle Container definieren | 373 |
| | | 9.1.1 | Containerelemente initialisieren | 373 |
| | | 9.1.2 | Einschränkungen für die Typen von Containerelementen | 376 |
| | 9.2 | Iteratoren und Iteratorbereiche | 378 |
| | | 9.2.1 | Iteratorbereiche | 381 |
| | | 9.2.2 | Ungültige Iteratoren durch Containeroperationen | 383 |
| | 9.3 | Operationen in sequenziellen Containern | 383 |
| | | 9.3.1 | Typedefs für Container | 384 |
| | | 9.3.2 | Die Elementfunktionen begin und end | 385 |
| | | 9.3.3 | Elemente zu einem sequenziellen Container hinzufügen | 386 |
| | | 9.3.4 | Relationale Operatoren | 390 |
| | | 9.3.5 | Größenoperationen für Container | 392 |
| | | 9.3.6 | Elementzugriff | 393 |
| | | 9.3.7 | Elemente löschen | 395 |
| | | 9.3.8 | Zuweisung und swap | 398 |
| | 9.4 | Wachstum von Vektoren | 400 |
| | | 9.4.1 | Die Elementfunktionen capacity und reserve | 401 |
| | 9.5 | Welcher Container soll verwendet werden? | 404 |
| | 9.6 | Weitere Anmerkungen zu Strings | 406 |
| | | 9.6.1 | Andere Möglichkeiten zur Konstruktion von Strings | 409 |
| | | 9.6.2 | Andere Möglichkeiten zum Ändern von Strings | 411 |
| | | 9.6.3 | Stringspezifische Operationen | 413 |
| | | 9.6.4 | Suchoperationen an Strings | 416 |
| | | 9.6.5 | Strings vergleichen | 419 |
| | 9.7 | Containeradapter | 422 |
| | | 9.7.1 | Der Stack-Adapter | 423 |
| | | 9.7.2 | Warteschlange und Prioritätswarteschlange | 425 |
| |
| Kapitel 10 Assoziative Container | 431 |
| | 10.1 | Zur Einführung: der Typ pair | 432 |
| | 10.2 | Assoziative Container | 435 |
| | 10.3 | Der Typ map | 436 |
| | | 10.3.1 | Eine Map definieren | 436 |
| | | 10.3.2 | Von map definierte Typen | 438 |
| | | 10.3.3 | Elemente zu einer Map hinzufügen | 439 |
| | | 10.3.4 | Eine Map indizieren | 439 |
| | | 10.3.5 | map::insert | 441 |
| | | 10.3.6 | Map-Elemente suchen und abrufen | 444 |
| | | 10.3.7 | Elemente aus einer Map löschen | 445 |
| | | 10.3.8 | Über eine Map iterieren | 446 |
| | | 10.3.9 | Eine Map zur Wortersetzung | 447 |
| | 10.4 | Der Typ set | 450 |
| | | 10.4.1 | Sets definieren und verwenden | 450 |
| | | 10.4.2 | Ein Set für eine Wortausschlussliste erstellen | 452 |
| | 10.5 | Die Typen multimap und multiset | 453 |
| | | 10.5.1 | Elemente hinzufügen und entfernen | 454 |
| | | 10.5.2 | Elemente in Multimaps und Multisets suchen | 454 |
| | 10.6 | Containerverwendung: Ein Programm zur Textabfrage | 458 |
| | | 10.6.1 | Der Entwurf des Abfrageprogramms | 459 |
| | | 10.6.2 | Die Klasse Text-Query | 460 |
| | | 10.6.3 | Die Klasse Text-Query verwenden | 462 |
| | | 10.6.4 | Die Elementfunktionen schreiben | 464 |
| |
| Kapitel 11 Generische Algorithmen | 469 |
| | 11.1 | Überblick | 470 |
| | 11.2 | Ein erster Blick auf die Algorithmen | 473 |
| | | 11.2.1 | Lesealgorithmen | 474 |
| | | 11.2.2 | Algorithmen zum Schreiben von Containerelementen | 476 |
| | | 11.2.3 | Algorithmen zum Umordnen von Containerelementen | 479 |
| | 11.3 | Weitere Anmerkungen zu Iteratoren | 485 |
| | | 11.3.1 | Einfügeiteratoren | 485 |
| | | 11.3.2 | E/A-Streamiteratoren | 487 |
| | | 11.3.3 | Reverse-Iteratoren | 492 |
| | | 11.3.4 | Iteratoren auf konstante Container | 495 |
| | | 11.3.5 | Die fünf Iteratorkategorien | 496 |
| | 11.4 | Struktur generischer Algorithmen | 499 |
| | | 11.4.1 | Parametermuster von Algorithmen | 500 |
| | | 11.4.2 | Namenskonventionen für Algorithmen | 501 |
| | 11.5 | Containerspezifische Algorithmen | 503 |
| |
| Teil III Klassen und die Datenabstraktion | 509 |
| |
| Kapitel 12 Klassen | 511 |
| | 12.1 | Klassendefinitionen und -deklarationen | 512 |
| | | 12.1.1 | Klassendefinitionen: Eine kurze Wiederholung | 512 |
| | | 12.1.2 | Datenabstraktion und Kapselung | 514 |
| | | 12.1.3 | Weitere Anmerkungen zu Klassendefinitionen | 517 |
| | | 12.1.4 | Klassendeklarationen und -definitionen im Vergleich | 521 |
| | | 12.1.5 | Klassenobjekte | 522 |
| | 12.2 | Der implizite Zeiger this | 523 |
| | 12.3 | Der Gültigkeitsbereich der Klasse | 528 |
| | | 12.3.1 | Namenssuche im Gültigkeitsbereich der Klasse | 530 |
| | 12.4 | Konstruktoren | 535 |
| | | 12.4.1 | Die Element-Initialisierungsliste | 538 |
| | | 12.4.2 | Standardargumente und Konstruktoren | 542 |
| | | 12.4.3 | Der Standardkonstruktor | 543 |
| | | 12.4.4 | Implizite Klassentypkonvertierungen | 546 |
| | | 12.4.5 | Explizite Initialisierung von Klassenelementen | 549 |
| | 12.5 | Freunde | 550 |
| | 12.6 | Statische Klassenelemente | 553 |
| | | 12.6.1 | Statische Elementfunktionen | 555 |
| | | 12.6.2 | Statische Datenelemente | 555 |
| |
| Kapitel 13 Kontrolliertes Kopieren | 563 |
| | 13.1 | Der Kopierkonstruktor | 564 |
| | | 13.1.1 | Der compilergenerierte Kopierkonstruktor | 568 |
| | | 13.1.2 | Einen eigenen Kopierkonstruktor definieren | 568 |
| | | 13.1.3 | Das Kopieren verhindern | 570 |
| | 13.2 | Der Zuweisungsoperator | 571 |
| | 13.3 | Der Destruktor | 573 |
| | 13.4 | Ein Beispiel zur Nachrichtenverarbeitung | 575 |
| | 13.5 | Zeigerelemente verwalten | 581 |
| | | 13.5.1 | Eine Klasse für intelligente Zeiger definieren | 584 |
| | | 13.5.2 | Wertähnliche Klassen definieren | 590 |
| |
| Kapitel 14 Überladene Operatoren und Typkonvertierungen | 597 |
| | 14.1 | Einen überladenen Operator definieren | 598 |
| | | 14.1.1 | Entwurf überladener Operatoren | 603 |
| | 14.2 | Ein- und Ausgabeoperatoren | 606 |
| | | 14.2.1 | Den Ausgabeoperator « überladen | 606 |
| | | 14.2.2 | Den Eingabeoperator » überladen | 609 |
| | 14.3 | Arithmetische und relationale Operatoren | 612 |
| | | 14.3.1 | Gleichheitsoperatoren | 613 |
| | | 14.3.2 | Relationale Operatoren | 614 |
| | 14.4 | Zuweisungsoperatoren | 615 |
| | 14.5 | Der Indexoperator | 616 |
| | 14.6 | Elementzugriffsoperatoren | 618 |
| | 14.7 | Inkrement- und Dekrementoperatoren | 621 |
| | 14.8 | Aufrufoperator und Funktionsobjekte | 626 |
| | | 14.8.1 | Funktionsobjekte mit Bibliotheksalgorithmen verwenden | 627 |
| | | 14.8.2 | In der Bibliothek definierte Funktionsobjekte | 629 |
| | | 14.8.3 | Funktionsadapter für Funktionsobjekte | 631 |
| | 14.9 | Typkonvertierungen und Klassentypen | 632 |
| | | 14.9.1 | Die Nützlichkeit von Typkonvertierungen | 633 |
| | | 14.9.2 | Konvertierungsoperatoren | 634 |
| | | 14.9.3 | Argumentübereinstimmung und Typkonvertierung | 638 |
| | | 14.9.4 | Überladungsauflösung und Klassenargumente | 643 |
| | | 14.9.5 | Überladung, Typkonvertierung und Operatoren | 646 |
| |
| Teil IV Objektorientierte und generische Programmierung | 653 |
| |
| Kapitel 15 Objektorientierte Programmierung | 655 |
| | 15.1 | Ein Überblick über OOP | 656 |
| | 15.2 | Basis- und abgeleitete Klassen definieren | 658 |
| | | 15.2.1 | Basisklassen definieren | 658 |
| | | 15.2.2 | Geschützte Elemente | 661 |
| | | 15.2.3 | Abgeleitete Klassen | 662 |
| | | 15.2.4 | Virtuelle und andere Elementfunktionen | 666 |
| | | 15.2.5 | Öffentliche, private und geschützte Vererbung | 670 |
| | | 15.2.6 | Freundschaft und Vererbung | 676 |
| | | 15.2.7 | Vererbung bei statischen Elementen | 676 |
| | 15.3 | Typkonvertierung und Vererbung | 677 |
| | | 15.3.1 | Konvertierung von abgeleiteten zu Basistypen | 678 |
| | | 15.3.2 | Konvertierung von Basiszu abgeleiteten Typen | 681 |
| | 15.4 | Konstruktoren und kontrolliertes Kopieren | 682 |
| | | 15.4.1 | Basisklassen-Konstruktoren und kontrolliertes Kopieren | 682 |
| | | 15.4.2 | Konstruktoren abgeleiteter Klassen | 682 |
| | | 15.4.3 | Kontrolliertes Kopieren und die Vererbung | 686 |
| | | 15.4.4 | Virtuelle Destruktoren | 689 |
| | | 15.4.5 | Virtuelle Funktionen in Konstruktoren und Destruktoren | 692 |
| | 15.5 | Der Klassengültigkeitsbereich bei der Vererbung | 692 |
| | | 15.5.1 | Namenssuche zur Kompilierungszeit | 693 |
| | | 15.5.2 | Namenskonflikte bei der Vererbung | 694 |
| | | 15.5.3 | Gültigkeitsbereich und Elementfunktionen | 695 |
| | | 15.5.4 | Virtuelle Funktionen und Gültigkeitsbereich | 697 |
| | 15.6 | Rein virtuelle Funktionen | 699 |
| | 15.7 | Container und Vererbung | 700 |
| | 15.8 | Handieklassen und Vererbung | 702 |
| | | 15.8.1 | Ein zeigerähnlicher Handle | 703 |
| | | 15.8.2 | Einen unbekannten Typ klonen | 706 |
| | | 15.8.3 | Den Handle verwenden | 707 |
| | 15.9 | Weitere Anmerkungen zu Abfragen | 712 |
| | | 15.9.1 | Eine objektorientierte Lösung | 713 |
| | | 15.9.2 | Ein wertähnlicher Handle | 715 |
| | | 15.9.3 | Die Klasse Query_base | 717 |
| | | 15.9.4 | Die Handleklasse Query | 718 |
| | | 15.9.5 | Die abgeleiteten Klassen | 721 |
| | | 15.9.6 | Die eval-Funktionen | 724 |
| |
| Kapitel 16 Templates und generische Programmierung | 731 |
| | 16.1 | Templatedefinitionen | 732 |
| | | 16.1.1 | Ein Funktionstemplate definieren | 733 |
| | | 16.1.2 | Ein Klassentemplate definieren | 735 |
| | | 16.1.3 | Templateparameter | 736 |
| | | 16.1.4 | Templatetypparameter | 738 |
| | | 16.1.5 | Nichttyp-Templateparameter | 741 |
| | | 16.1.6 | Generische Programme schreiben | 742 |
| | 16.2 | Instanziierung | 745 |
| | | 16.2.1 | Deduktion der Templateargumente | 747 |
| | | 16.2.2 | Explizite Argumente von Funktionstemplates | 752 |
| | 16.3 | Kompilierungsmodelle für Templates | 754 |
| | 16.4 | Elemente von Klassentemplates | 758 |
| | | 16.4.1 | Elementfunktionen von Klassentemplates | 761 |
| | | 16.4.2 | Templateargumente für Nichttypparameter | 766 |
| | | 16.4.3 | friend-Deklarationen in Klassentemplates | 766 |
| | | 16.4.4 | friend-Deklarationen für Queue und Queueltem | 769 |
| | | 16.4.5 | Elementtemplates | 771 |
| | | 16.4.6 | Die vollständige Klasse Queue | 775 |
| | | 16.4.7 | Statische Elemente von Klassentemplates | 777 |
| | 16.5 | Eine generische Handieklasse | 778 |
| | | 16.5.1 | Die Handleklasse definieren | 779 |
| | | 16.5.2 | Den Handle verwenden | 780 |
| | 16.6 | Spezialisierung von Templates | 783 |
| | | 16.6.1 | Funktionstemplates spezialisieren | 784 |
| | | 16.6.2 | Klassentemplates spezialisieren | 787 |
| | | 16.6.3 | Elemente ohne die Klasse spezialisieren | 789 |
| | | 16.6.4 | Partielle Spezialisierung von Klassentemplates | 791 |
| | 16.7 | Überladung bei Funktionstemplates | 792 |
| |
| Teil V Fortgeschrittene Themen | 801 |
| |
| Kapitel 17 Werkzeuge für umfangreiche Programme | 803 |
| | 17.1 | Ausnahmebehandlung | 804 |
| | | 17.1.1 | Auslösen einer Ausnahme vom Klassentyp | 805 |
| | | 17.1.2 | Stack-Abwicklung | 807 |
| | | 17.1.3 | Eine Ausnahme abfangen | 809 |
| | | 17.1.4 | Ausnahmen erneut auslösen | 811 |
| | | 17.1.5 | Ein universeller Handler | 812 |
| | | 17.1.6 | try-Blöcke für Funktionen und Konstruktoren | 812 |
| | | 17.1.7 | Klassenhierarchien bei Ausnahmen | 814 |
| | | 17.1.8 | Automatische Ressourcenfreigabe | 816 |
| | | 17.1.9 | Die Klasse auto_ptr | 818 |
| | | 17.1.10 | Ausnahmespezifikationen | 824 |
| | | 17.1.11 | Ausnahmespezifikationen für Funktionszeiger | 829 |
| | 17.2 | Namensbereiche | 830 |
| | | 17.2.1 | Namensbereichsdefinitionen | 830 |
| | | 17.2.2 | Verschachtelte Namensbereiche | 835 |
| | | 17.2.3 | Unbenannte Namensbereiche | 837 |
| | | 17.2.4 | Namensbereichselemente verwenden | 838 |
| | | 17.2.5 | Klassen, Namensbereiche und Gültigkeitsbereich | 843 |
| | | 17.2.6 | Überladung und Namensbereiche | 847 |
| | | 17.2.7 | Namensbereiche und Templates | 850 |
| | 17.3 | Mehrfache und virtuelle Vererbung | 850 |
| | | 17.3.1 | Mehrfache Vererbung | 851 |
| | | 17.3.2 | Typkonvertierung und mehrfache Basisklassen | 853 |
| | | 17.3.3 | Kontrolliertes Kopieren für mehrfach abgeleitete Klassen | 857 |
| | | 17.3.4 | Der Klassengültigkeitsbereich bei der mehrfachen Vererbung .. | 858 |
| | | 17.3.5 | Virtuelle Vererbung | 861 |
| | | 17.3.6 | Deklaration virtueller Basisklassen | 863 |
| | | 17.3.7 | Besondere Initialisierungssemantik | 864 |
| |
| Kapitel 18 Besondere Werkzeuge und Techniken | 873 |
| | 18.1 | Die Speicherzuweisung optimieren | 873 |
| | | 18.1.1 | Speicherzuweisung in C++ | 874 |
| | | 18.1.2 | Die Klasse allocator | 875 |
| | | 18.1.3 | Die Funktionen operator new und operator delete | 880 |
| | | 18.1.4 | Placement-new-Ausdrücke | 882 |
| | | 18.1.5 | Expliziter Destruktoraufruf | 884 |
| | | 18.1.6 | Klassenspezifische new- und delete-Ausdrücke | 885 |
| | | 18.1.7 | Eine Basisklasse für die Speicherzuweisung | 887 |
| | 18.2 | Typidentifizierung zur Laufzeit | 894 |
| | | 18.2.1 | Der Operator dynamic_cast | 895 |
| | | 18.2.2 | Der Operator typeid | 898 |
| | | 18.2.3 | RTTI verwenden | 899 |
| | | 18.2.4 | Die Klasse type_info | 902 |
| | 18.3 | Zeiger auf Klassenelemente | 903 |
| | | 18.3.1 | Zeiger auf Elemente deklarieren | 904 |
| | | 18.3.2 | Zeiger auf Klassenelemente verwenden | 906 |
| | 18.4 | Verschachtelte Klassen | 910 |
| | | 18.4.1 | Implementierung verschachtelter Klassen | 911 |
| | | 18.4.2 | Namenssuche im Gültigkeitsbereich verschachtelter Klassen .. | 915 |
| | 18.5 | Platzsparende Klassen: union | 916 |
| | 18.6 | Lokale Klassen | 920 |
| | 18.7 | Nicht portierbare Merkmale | 922 |
| | | 18.7.1 | Bitfelder | 922 |
| | | 18.7.2 | Der Qualifizierer volatile | 924 |
| | | 18.7.3 | Die Verlinkungsdirektive extern "C" | 925 |
| |
| Kapitel A Die Bibliothek | 935 |
| | A.1 | Namen und Header | 936 |
| | A.2 | Ein Überblick über die Algorithmen | 938 |
| | | A.2.1 | Algorithmen zur Suche nach Objekten | 938 |
| | | A.2.2 | Andere Lesealgorithmen | 940 |
| | | A.2.3 | Algorithmen zur binären Suche | 941 |
| | | A.2.4 | Algorithmen zum Schreiben von Containerelementen | 942 |
| | | A.2.5 | Partitionierungs- und Sortieralgorithmen | 944 |
| | | A.2.6 | Allgemeine Umordnungsoperationen | 946 |
| | | A.2.7 | Permutationsalgorithmen | 948 |
| | | A.2.8 | Mengenalgorithmen für geordnete Folgen | 949 |
| | | A.2.9 | Minimal- und Maximalwerte | 950 |
| | | A.2.10 | Numerische Algorithmen | 951 |
| | A.3 | Weitere Anmerkungen zur E/A-Bibliothek | 953 |
| | | A.3.1 | Formatstatus | 953 |
| | | A.3.2 | Viele Manipulatoren ändern den Formatstatus | 953 |
| | | A.3.3 | Ausgabeformate steuern | 954 |
| | | A.3.4 | Eingabeformate steuern | 962 |
| | | A.3.5 | Unformatierte E/A-Operationen | 963 |
| | | A.3.6 | Ein-Byte-Operationen | 963 |
| | | A.3.7 | Multi-Byte-Operationen | 965 |
| | | A.3.8 | Wahlfreier Zugriff auf einen Stream | 967 |
| | | A.3.9 | Lesen und Beschreiben derselben Datei | 970 |
| |
| Index | 973 |