Vorwort
Inhaltsverzeichnis
Einführung
Inhalt
Schwerpunkt
C++ und C
C++ und Java
C++ und C#
Sprache und Bibliothek
Compilerversionen
Sprachversionen
Pre-Standard und Standard
Voraussetzungen
Support über das Internet
Literatur
Einige Anmerkungen
C++ ist nichts anderes als C mit einigen Verbesserungen
Java/C/Basic/Smalltalk/Perl/Delphi/Lisp
ist besser als C++!
Aber C++ ist so komplex!
Aber C++ ist langsam!
Aber C++ ist nicht plattformunabhängig!
1 Das erste Programm
Hello, world!
Im Einzelnen
Eigene Experimente
2 Hinter den Kulissen
Der Übersetzungsvorgang
Der Begriff „Übersetzungseinheit“
Übersetzungseinheiten und Dateien
Der Präprozessor
Separate Übersetzung und der Binder
Die Aufgabe des Binders
Statisches und dynamisches Binden
Native und
CFront-Compiler
Vorübersetzte Header
3 Fundamentale Typen
Übersicht
Integrale- und Fließkomma-Typen
Ganzzahlige Typen
Die Spezifizierer short und long
Die Spezifizierer signed und unsigned
Literale
Literale im Oktal- und Hexadezimalsystem
Spezifizierer für Literale
Fließkomma-Typen
Der Spezifizierer long
Rundungseffekte
Spezielle Fließkommawerte
Literale
Zeichentypen
Die Spezifizierer signed und unsigned
Größe eines char und Sprachvarianten
Unicode und wchar_t
Literale
Spezielle Literale
(„Escape-Sequenzen”)
Zeichenketten
Zeichenketten-Literale
Zusammenfassung von String-Literalen
Fortsetzung von String-Literalen
Unicode
(wide-character)-String-Literale
Wahrheitswert-Typ
Wahrheitswerte und numerische Typen
Größen und Grenzwerte fundamentaler Typen
Der Operator sizeof
Das Verhältnis der Größen
Wertebereiche
Repräsentation von Fließkommanwerten
Die Dateien limits.h und float.h
Die Datei limits
Spezielle Werte für Fließkommatypen
Weitere Datentypen
Typen unter anderen Namen
Compilerspezifische Typen
4 Operationen mit fundamentalen Typen
Übersicht
Ein einführendes Beispiel
Integer- und Fließkommaarithmetik
Spezialfall Division
Welche Arithmetik wird verwendet?
Welche Genauigkeit wird verwendet?
Operatoren
Arithmetische Operatoren
Shift-Operatoren
Bit-Operatoren
Logische Operatoren
Vergleichsoperatoren
Zuweisungsoperatoren
Der Komma-Operator
Der sizeof-Operator
Der Auswahl-Operator
Präzedenz und Assoziativität
Implizite Konvertierungen
Anmerkungen
bool und int
Weitere Operatoren
Eigene Funktionalität für Operatoren
Alternative Symbole
5 Ausdrücke, Anweisungen und Kontrollstrukturen
Ausdrücke und Anweisungen
Ausdrücke
Anweisungen
Zusammen gesetzte Anweisungen
Anweisungsblöcke
Geschachtelte Anweisungsblöcke
Kontrollstrukturen
Die if-Anweisung
Geschachtelte if-Anweisungen
if-else Kaskaden
Die switch-Anweisung
Die while-Anweisung
Die do-Anweisung
Die for-Anweisung
Die break-Anweisung
Die continue-Anweisung
Die goto-Anweisung
Einige Anmerkungen zu Kontrollstrukturen
Welche Kontrollstruktur zu welchem Zweck?
Formulierung von Kontrollanweisungen
Gültigkeitsbereich von Variablen in Kontrollausdrücken
Definition von Variablen in Kontrollausdrücken
Schleifen und leere Anweisungen
signed und
unsigned
6 Variablen und Objekte, Deklaration und Definition, Funktionen
Variablen
Name
Typ
Speicherbereich
Variablen und Literale
Initialisierung von Variablen
Objekte
Begriffsdefinition
Objekte und Variablen
Programmobjekte
R-Wert und L-Wert
Deklaration und Definition
Definition
Deklaration
Sprachbindung
Platzierung von Deklarationen und Definitionen
Die „One
Definition Rule“
Funktionen
Aufruf
Parameter
Ergebnisrückgabe
Variable Parameterliste
Implementierung
variabler Parameterlisten
Deklaration und Definition
Weglassen von Parameternamen
Leere Parameterliste bzw. keine Ergebnisrückgabe
Leere Parameterliste bei C-Funktionen
Rekursive Funktionen
Inline-Funktionen
Platzierung
Signatur
„Old-Style“-
Parameterdeklaration
Funktion main
Rückgabetyp von main
Parameter von main
Weitere Besonderheiten
Alternative Beendigung: Die Funktionen exit und abort
Ende-Funktionen
7 Gültigkeitsbereich und
Bindung
Programmobjekte
Gültigkeitsbereiche (scopes)
Lokaler Gültigkeitsbereich (local cope)
Funktions-Prototypen-Gültigkeitsbereich (function prototype
scope)
Globaler Gültigkeitsbereich (global scope)
Klassen- und Namensbereichs-Gültigkeitsbereiche (class- , namespace scope)
Schachtelung von Gültigkeitsbereichen
Der Scope-Operator ::
Bindung (linkage)
Der Modifizierer static
static und der globale Gültigkeitsbereich
Beispiel Zufallszahlengenerator
Fallstudie Datenverschlüsselung
Static und der local scope
Beispiel: Aufrufzähler
Beispiel: Rekursionszähler
8 Abgeleitete Datentypen und
Modifizierer
Fundamentale, abgeleitete und benutzerdefinierte Datentypen
Modifizierer
Das Schlüsselwort typedef
9 Strukturen und Unions
Strukturen
Strukturdefinition
„Old-style“ Definition
Definition von Objekten
Anonyme Strukturen
Zugriff auf die Mitglieder
Initialisierung
Zuweisung
Parameterübergabe
Temporäre Objekte
Größe von Strukturen und „Padding“
Strukturen mit nur einem oder gar keinen Mitgliedern
struct und
class
Ausblick auf das Klassenkonzept
Unionen
Definition
Unionen und Strukturen
Speicherlayout
Anwendungsfälle für Unionen
Beispiel: Vertauschen von Bytes
Beispiel: Varianten
Sind Unionen Objekte?
10 Felder
Felddefinition
Speicherlayout
Zugriff auf die Elemente
Initialisierung
Implizite Dimension
Zuweisung
Parameterübergabe
Mehrdimensionale Felder
Ein Feld von Feldern
Ein häufig gemachter Fehler
Einige Anmerkungen zu Feldern
11 Zeiger und
Referenzen
Zeiger
Definition
Zeiger, Variable und Adressen
Zeiger sind typisiert
Zeigertyp void*
Typwandlungen mit Zeigern
Beispiel: Typwandlung von Zeigern in C
Der Nullzeiger
Das Makro NULL
Dereferenzierung
Dereferenzierung und Nullzeiger
Dereferenzierung und Strukturen
Lebenszeit von Objekten und Zeigern
Initialisierung und Zuweisung
Parameterübergabe
Rückgabe von Zeigern aus Funktionen
Vergleich
Arithmetik mit Zeigern
Anwendungsfälle für Zeigerarithmetik
Zeiger und Felder
Zeichenketten
Zeichenketten und der Typ string
Beispiel: Verbinden zweier Strings in C
Zeiger auf Funktionen
Funktionszeiger und „normale“ Zeiger
Referenzen
Definition
Zugriff auf das referenzierte Objekt
Referenzen als Funktionsparameter
Referenzen als Funktionsrückgaben
Initialisierung mit anderem Typ
Fallstudie FixedArray
Referenzen sind keine Objekte
Einige Anmerkungen zu Zeigern und Referenzen
Referenzen und Zeiger: Konzeptionelles
Wertübergabe und Referenzübergabe von Parametern
Ein Wort zur Notation
12 Konstante und
volatile Objekte
Konstanten
Konstante fundamentale Daten
Übersetzungszeit- und Laufzeit-Konstanten
const und #define
Konstante Felder
Konstante Strukturen
Konstante Typen und konstante Objekte
Konstanten als Strukturmitglieder
Volatile Objekte
Anwendungen von volatile
const und gleichzeitig volatil?
const und volatile mit Verweisen
const/volatile mit Zeigern
const/volatile mit Referenzen
const bei Funktionsparametern
Lohnt sich die Verwendung von const?
const-correctness
und const cast-away
Die Ausnahme für Stringliterale
CV-Qualifizierung
13 Dynamische Speicherverwaltung
Lokale, globale und dynamische Objekte
Dynamische Objekte
Klassischer Stil: malloc und free
C++ Stil: new und delete
Der new-Handler
Zusammenfassung der Unterschiede new/delete und malloc/free
Fallbeispiel Lineare Liste
Fallstudie Dynamisches Feld
Die Freispeicherverwaltung
Eigene Freispeicherverwaltung
Debug-Freispeicherverwaltung
14 Verschiedenes
Aufzählung
Definition
Aufzählungen sind eigene Typen
Anwendungsfälle für Aufzählungen
Zu Grunde liegender Datentyp
Bitfelder
Definition
Anwendungsfälle für Bitfelder
Einige Besonderheiten
Das Schlüsselwort typedef
Anwendungsfälle für typedef
Alias auf unterschiedliche Namen
Abkürzung von häufig gebrauchten Typen
Dokumentation bestimmter Verwendungen
Kompatibilität zu C
Erhöhung der Übersichtlichkeit
Vorgabewerte
15 Überladen von Funktionen
Die Signatur einer Funktion
Name mangling
Wann ist Überladen sinnvoll?
Namensauflösung
Zulässige und unzulässige Fälle
Der Rückgabetyp gehört nicht zur Signatur
typedef und #define bilden keine neuen Typen
T, const T und volatile T sind nicht unterscheidbar
T und T& sind nicht unterscheidbar
T[] und T* sind nicht unterscheidbar
T* und const T* sowie T& und const T& sind unterscheidbar
Vorgabewerte
Typwandlungen bei der Auflösung
16 Der Präprozessor, Makros und Bedingte Übersetzung
Der Präprozessor
Präprozessor-Direktiven
Definition und Undefinition von Makros
Definition
Makros mit Parametern
Mehrzeilige Makros
Undefinition
Redefinition
Definition über Compilerschalter
Abfrage von Makros
Präprozessor-Direktiven #if und #endif
#if und undefinierte Makros
Erlaubte und nicht erlaubte Vergleiche
Präprozessor-Direktiven #else und #elif
Schlüsselwort defined
Kurzformen #ifdef und #ifndef
Schachtelung von Abfragen
Makrosubstitution
Substitution im Programmtext
Makros mit Kommentaren
Funktionsmakros
Der # Operator
Der ## Operator
Weitere Operatoren
Includieren von Dateien
Präprozessor-Direktive #include
Relative und absolute Pfade
Suchreihenfolge von Verzeichnissen
Kommandozeilenparameter /I
Umgebungsvariable INCLUDE
Dateien der Standardbibliothek
Makros in
Include-Direktiven
Weitere Direktiven
Error-Direktive
Line-Makro
Pragma-Direktiven
Leere Direktive
Vordefinierte Makros
Alternative Symbole, Digraphs und Trigraphs
Alternative Symbole und Digraphs
Trigraphs
Verwendung
Einige Anmerkungen
Probleme mit Makros
Makros als Konstanten
Makros als Funktionen
Include Guards
17 Klassen
Definition einer Klasse
Datenelemente
Funktionen
Objekte
Zugriff auf Klassenmitglieder
Zugriffe innerhalb der Klasse
Zugriffe von außen
Zugriffssteuerung
Die Freund-Deklaration
Funktionen als Freunde
Klassen als Freunde
Gegenseitige Freunde
Wann sind Freund-Deklarationen sinnvoll?
Die Bedeutung der Zugriffssteuerung
Konstruktoren und Destruktoren
Die Initialisierungsproblematik
Die Zerstörungsproblematik
Konstruktoren
Konstruktoren mit Argumenten
Der Standardkonstruktor
Impliziter Standardkonstruktor
Klassen mit mehreren Konstruktoren
Der Kopierkonstruktor
Destruktoren
Impliziter Destruktor
Expliziter Aufruf
Lokale Objekte
Statische Objekte
Globale Objekte
Nicht-öffentliche Konstruktoren
Objekte von Klassen als Datenmitglieder
Ein unerwarteter Effekt
Ein unerwarteter Effekt – Teil II
Initialisierung für fundamentale Typen
Klasse Person – Teil II
Initialisierung und Zuweisung
Felder von Objekten
Standardkonstruktor
Konstruktor mit einem Argument
Konstruktor mit mehr als einem Argument
Gemischte Initialisiererliste
Dynamische Objekte
Die Operatoren new und delete
new und delete für Felder von Objekten
Der this-Zeiger
18 Projekt FixedArray
Das Problem
Der Ansatz
Klasse FixedArray
Ein Beispiel
Vergleich
Speichermangel
Klasse FixedArray und Schablone vector
Ausblick
19 const mit Klassen
Konstante Objekte
Konstante Mitgliedsfunktionen
Konstante Datenmitglieder
Laufzeit- und Übersetzungszeitkonstanten
Der enum-Trick
Überladen auf Grund von const
Das Schlüsselwort mutable
Das Problem
Die Cache-Technik
Lösung mit mutable
Lösung durch const-cast-away
Einige Besonderheiten
20 Objekte als Funktionsparameter: Der Kopierkonstruktor
Der Kopierkonstruktor
Allgemeine Form des Kopierkonstruktors
Der Implizite Kopierkonstruktor
Zusammen gesetzte Objekte
Klassen mit Resourcen
Resourcen und die Dreierregel
Nicht kopierbare Objekte
Objekte als Parameter für Funktionen
Wertübergabe und Referenzübergabe
const oder nicht const ?
const-cast-away
const und Wertübergabe
Objekte als Rückgabewerte von Funktionen
Return Value Optimization (RVO)
Übergabe eines zusätzlichen Parameters
Rückgabe von Verweisen
Rückgabe einer Referenz auf das eigene Objekt
Rückgabe von mehr als einem Objekt
Kopieren bei Veränderung
21 Statische Klassenmitglieder
Eine weitere Bedeutung von static
Statische Datenmitglieder einer Klasse
Konstante statische Mitglieder
Statische Mitgliedsfunktionen
Fallbeispiel: Codierung spezieller Werte
Fallbeispiel: Mitrechnen von Ressourcen
Fallbeispiel: Anzahl erzeugbarer Objekte begrenzen
Fallbeispiel: Rekursionszähler
22 Operatorfunktionen
Ausgangsposition
Formulierung als Operatorfunktion
Operatoren als Mitgliedsfunktionen einer Klasse
Überladen
Operator als globale oder als Mitgliedsfunktion
Die Bedeutung des Rückgabetyps
Rückgabe des eigenen Objekts bei Mitgliedsfunktionen
Selbstdefinierbare Operatoren
Der Einfache Zuweisungsoperator =
Deklaration des Operators
Alternative Formen
Wert- und Referenzsemantik
Standard-Zuweisungsoperator
Impliziter Standard-Zuweisungsoperator
Ein Zuweisungsoperator für die Klasse FixedArray
Zuweisungsoperator und Kopierkonstruktor
Die Großen Drei (big three)
Zuweisung auf sich selbst
Übungen
Die erweiterten Zuweisungsoperatoren
Die Vergleichsoperatoren == und !=
Der Negationsoperator !
Die Operatoren ++ und --
Der Subscript-Operator []
Der Funktionsaufruf-Operator ()
Der Zeigerzugriff-Operator ->
Der Komma-Operator
Die Operatoren << und >>
Einige Anmerkungen
23 Allokations- und Deallokationsfunktionen
Eine unglückliche Terminologie
Allokations- und Deallokationsfunktionen
Standard Allokations- und Deallokationsfunktionen
Eigene Allokations- und Deallokationsfunktionen
Anforderungen an Allokations- und Deallokationsfunktionen
Implementierung als Mitgliedsfunktionen
Implementierung als globale Funktionen
Speicherüberlauf
Allokations- und Deallokationsfunktionen mit weiteren Parametern
Platzierung von Objekten
Debug-Unterstützung
Standardversionen der Allokations- und Deallokationsfunktionen
Vorgeschriebene Versionen
Nothrow- und Platzierungsversionen
Ersetzbarkeit
24 Typwandlungen
Einführung
Standardkonvertierungen
Zeiger und Referenzen
Explizite Typwandlungen
Operator static_cast<>
Operator dynamic_cast
Operator const_cast
Operator reinterpret_cast
C- Wandlungsoperator
Vergleich der C++- und C-Wandlungsoperatoren
Benutzerdefinierte Wandlungen
Die klassische Variante
Exkurs: Die printf-Funktionsfamilie
Wandlung über Konstruktoren
Konstruktoren mit mehreren Parametern
Das Schlüsselwort explicit
Wandlung über Operatoren
Wandlung über Konstruktor oder Operatorfunktion?
Konvertierung über Konstruktor
Konvertierung über Operatorfunktion
Mehrstufige Wandlungen
Typwandlung und symmetrische Operatoren
Einige häufige Typwandlungen
Operator bool
Operator char*
Operator string
25 Einige Sonderfälle mit Klassen
Deklaration und Definition bei Klassen
Lokale Klassen
Funktionslokale Klassen
Geschachtelte Klassen
Spezielle Mitglieder: Referenzen und Konstanten
plain old data structures (PODs)
Einige Anmerkungen
26 Vererbung
Die Grundlagen
Ein Beispiel
Neue Mitglieder
Redefinierte Mitglieder
Überladen und Verdecken
Explizite Qualifizierung
Namensinjektion
Klassenhierarchien
Mehrfachvererbung
Ein Beispiel
Namenskonflikte
Mehrfach vorhandene Basisklassen
Virtuelle Basisklassen
Speicherlayout
Zugriffsschutz
Das Schlüsselwort protected
Wann sind geschützte Mitglieder sinnvoll?
Freunde bei der Vererbung
Öffentliche und nicht-öffentliche Ableitungen
Öffentliche Ableitungen
Private Ableitungen
Geschützte Ableitungen
Ein Spezialfall
Redeklaration von Zugriffsberechtigungen
Implizite Wandlung von Ableitung zu Basisklasse
Zugriff auf Teilobjekte
Zeiger und Referenzen
Explizite Wandlung von Basisklasse zu Ableitung
Mehrfachvererbung
Nicht-öffentliche Ableitungen
Virtuelle Basisklassen
Arbeit mit Basisklassenverweisen
Nicht vererbbare Funktionen
Konstruktoren
Initialisierung mit Standardkonstruktor der Basisklasse
Impliziter Standardkonstruktor in der Ableitung
Kompatibilität zu C
Mehrfachvererbung
Virtuelle Basisklassen
Aufrufreihenfolge von Konstruktoren
Destruktoren
Aufrufreihenfolge von Destruktoren
Zuweisungsoperatoren
Virtuelle Basisklassen
Wann sind Ableitungen sinnvoll?
Die is-a - Beziehung
Die has-a - Beziehung
Beispiel 1: Klassen Fahrzeug und Rad
Beispiel 2: Klassen Point und Circle
Beispiel 3: Fallstudie Klassen Square und Rectangle
Nicht-öffentliche Ableitungen
27 Projekt FixedArray – Teil II
Fehlerkonzept
Stil und Form
Die großen Drei
Zugriff auf die Elemente
Vergleich
Gleichheit und Identität
Sonstige Funktionen
Testkonzept und Beispiele
28 Fallstudie Wiederverwendung I: Klasse NamedFractInt
Die Aufgabenstellung
Die vorhandene Klasse FractInt
Die Ableitung NamedFractInt
Einige Probleme
Basisklassentyp vs. Ableitungstyp
Delegationsfunktionen
Slicing
Einige weitere Überlegungen
29 Fallstudie Wiederverwendung II: Mehrfachableitung
Die Aufgabenstellung
Objekte mit Namen
Die Klasse NamedObjectBase
Die Führung des Namens
Registrierung und Deregistrierung
Die Ableitung NamedFractInt
Ein Beispiel
Reprise: Implizite Versionen von Funktionen
Ergebnisse
30 Fallstudie Wiederverwendung III: Factoring
Die Aufgabenstellung
Faktorisieren von Eigenschaften
Klasse FixedArray
Klasse MemoryBlock
Erster Versuch
Zweiter Versuch
Repräsentation des Speicherblocks
Fehlerkonzept
Konstruktor
Die Großen Drei (big three)
Alternative Implementierung der Großen Drei
Professionelle Implementierung der Großen Drei
Noch einmal: Kontraktorientiertes Programmieren
Zugriff auf den Speicherblock
Die Wandlung in hexadezimale Notation
Vergleichskonzept
Bytes vs. Objekte
Vergleichen
Kopieren
Formulierung von FixedArray mit Hilfe von MemoryBlock
Komposition
Private Ableitung
Noch einmal: Faktorisierung
Die Klasse TypedMemoryBlock
Formulierung von FixedArray mit Hilfe von TypedMemoryBlock
Zusammenfassung
Anmerkung
Praktische Erwägungen
31 Virtuelle Funktionen
Ein Beispiel
Statischer und dynamischer Typ
Frühe und späte Bindung
Voraussetzungen
Klassenhierarchien
Etwas Hintergrund
Gleiche Signatur
Gleicher Rückgabetyp
Kovariante Rückgabetypen
Einige Unterschiede zu nicht-virtuellen Funktionen
Einmal virtuell - immer virtuell
Virtuelle Funktionen müssen definiert werden
Virtuelle Funktionen dürfen nicht statisch sein
Virtuelle Funktion können inline sein
Dynamische vs. statische Bindung
Zugriffssteuerung bei virtuellen Funktionen
Nicht-öffentliche Ableitungen
Abstrakte Funktionen
Die virtual function pointer table
Fallstricke
Direkter Zugriff auf Objektdaten
Zeigerarithmetik und Indexzugriff
Virtuelle Destruktoren
Redeklarieren und Überladen
Der Operator sizeof
Virtuelle Funktionen in Konstruktoren und Destruktoren
32 Fallstudie Programming By Exception
Das Problem
Die Lösung mit virtuellen Funktionen
Eigenschaften der Lösung
Standard-Fehlerbehandlungsroutine
Kritik
Alternative: Funktionszeiger
Kritik
Funktionszeiger und Rückruffunktionen (callbacks)
Ausblick
33 Fallstudie Polymorphismus
Die Grundlagen
Ein Beispiel
Abstrakte Basisklasse Base
Klassen A und B als Ableitungen
Container von Objekten
Ausdruck aller Objekte
Verwendung von typedef zur Schreibvereinfachung
Anmerkungen zur Funktionalität von printAll
Einige Bemerkungen
Schnittstelle und Implementierung
Algorithmus und Schnittstelle
Schnittstellenorientierte Programmierung
Beispiel Sortieralgorithmus
Interface Sortable
Konkrete Klassen
Operator dynamic_cast
Das klassische Beispiel
Bewertung
Virtuelle Konstruktoren
Tiefe und flache Kopie
Wertsemantik und Referenzsemantik
Tiefe Kopie für Standard-Container
Einige Anmerkungen
Die Eigentümerfrage
auto_ptr und andere Intelligente Zeiger
Alternative Implementierungen
34 Typinformationen zur Laufzeit
Die Klasse type_info
type_info-Objekte
Operator typeid
typeid für Ausdrücke
typeid mit polymorphen Klassen
typeid mit nicht-polymorphen Klassen
Manuelle Typabfrage vs. virtuelle Funktionen
Manuelle Typabfrage
Virtuelle Funktionen
Operator dynamic_cast
Ungleiche Signatur
Information ist in der Basisklasse nicht vorhanden
Operator dynamic_cast
Einige Details zur Klasse type_info
Konstruktoren und Zuweisungsoperator
Die Funktion name
Die Funktion before
35 Schablonen
Das Problem
Funktionsschablonen
Definition
Instanziierung
Automatische Erschließung der Schablonenparameter
Explizite Angabe der Schablonenparameter
Deklaration und Definition
Spezialisierung
Überladen
Partielle Ordnung von Schablonenvarianten
Explizite Funktionen
Namensauflösung
Statische Variable
Mitgliedsschablonen
Funktionsschablonen und Makros
Klassenschablonen
Ein Beispiel
Instanziierung
Mitgliedsfunktionen
Instanziierung – Teil II
Statische Mitglieder
Mitgliedsschablonen
Schablonenparameter, die keine Typen sind
Vorgabewerte für Schablonenparameter
Explizite Spezialisierung
Partielle Spezialisierung
Spezialitäten bei der Namensauflösung
Notationelles
typename und class
Typische Anwendungen für Schablonen
Generalisierung von Abläufen
Wertepaare, Tripel etc.
Generische Container
Schablonen-Metaprogrammierung
Instanziierung - auf den zweiten Blick
Buchführung
Eliminierung von Mehrfachinstanzen durch den Binder
Instanziierung als eigenständigen Schritt
Explizite Buchführung
Platzierung von Quellcode für Schablonen
Schlüsselwort export
Syntaxfehler in Schablonen
Bindung von Namen
Explizite Instanziierung
36 Projekt FixedArray – Teil III
Erhöhung der Flexibilität
Statische vs. dynamische Aspekte
Die Schablonendefinition
Speicherplatz vom Stack
Konstruktoren
Standardkonstruktor
Kopierkonstruktor
Zuweisungsoperator
Destruktor
Vergleichskonzept
Zugriff auf die Feldelemente
Ausgabekonzept
Einige Anmerkungen
Effizienzfragen
Objekterzeugung und Zerstörung
Zugriff auf Feldelemente
Kompatibilitätsfragen
Zusammenfassung
Weitere Entwicklung
37 Ausnahmen
Das Problem
Fehlerbehandlung in der Funktion selber
Rückmeldung eines Fehlercodes
Anforderungen an ein bessere Lösung
Ausnahmen
Beispiel
Einige Anmerkungen
Auffinden des Behandlers
try und catch
Die Suche verläuft von innen nach außen
Die Ausnahmebehandlung ist typisiert
Behandler können „hintereinander geschaltet“ werden
Namensauflösung bei Funktionen und Auffinden eines Behandlers
Fortsetzung des Programms
Untypisierte Behandler
Propagieren von Ausnahmen
Implizites Propagieren
Explizites Propagieren
Aufräumen des Stack (stack unwinding)
Ein einfaches Beispiel
Resource aquisition is initialisation
Statische Variable
Funktions-try-Blöcke
Funktions-try-Blöcke für Konstruktoren
Funktions-try-Blöcke für Funktionen
Ausnahmen in Konstruktoren und Destruktoren
Konstruktoren
Destruktoren
Globale Objekte
Statische Objekte
Initialisierung und Zerstörung zusammen gesetzter Objekte
Beispiel eines zusammen gesetzten Objekts
Vollständig und teilweise konstruierte Objekte
Konsequenzen
Ableitungen
Felder
Einige Details zur Ausnahmebearbeitung
Abläufe beim Werfen, Propagieren bzw. Fangen einer Ausnahme
Wann ist eine „Ausnahme aktiv“?
Weitere Ausnahmen während der aktiven Ausnahmebehandlung
Objekte von Klassen als Ausnahmeobjekte
Übertragung von zusätzlichen Informationen
Hierarchien von Ausnahmeklassen
Organisieren von Behandlern
Ausnahmespezifikationen
Vereinbarung der möglichen Ausnahmen
Nicht vereinbarte Ausnahmen
Einige Sonderfunktionen
Die Funktion uncaught_exception
Die Funktion terminate
Eigene terminate-Funktionen
Die Funktion unexpected
Eigene unexpected-Funktionen
Die Standard-Ausnahmeklassen
Die Basisklasse exception
Logische Fehler
Laufzeitfehler
Spezielle Ausnahmen der Standardbibliothek
Anwendung auf die Schablone FixedArray
Die Ausnahmeklasse
Andere Ausnahmekonzepte
38 Namensbereiche
Das klassische Problem
Die traditionelle Lösung
Eigenschaften der traditionellen Lösung
Namensbereiche
Definition eines Namensbereiches
Zugriff auf Mitglieder eines Namensbereiches
Vollständige Qualifikation
Zugriff innerhalb des Namensbereiches
Using-Deklaration
Using-Direktive
Mehrdeutigkeiten
Namensbereiche sind erweiterbar
Alias-Namen
Schachtelung von Namensbereichen
Namenlose Namensbereiche
Einige Details
Namenloser Namensbereich und static
Der Namensbereich std
iostream und iostream.h
Koenig-Lookup
Namensbereiche und C-Funktionen
Using-Deklarationen in Klassenhierarchien
Ermöglichen von Überladen von Namen aus der Basisklasse
Vermeiden von Mehrdeutigkeiten bei Mehrfachableitungen
Redeklaration von Zugriffsberechtigungen
Using-Deklarationen beziehen sich auf alle überladenen Varianten einer F.
Using-Direktiven sind nicht erlaubt
Anwendung von Namensbereichen
Partitionierung des globalen Namensraumes einer Anwendung
Kapselung von zusammen gehörigen Konstrukten
39 Wie geht es weiter
Anhang 1: Priorität und Assoziativität von Operatoren
Anhang 2: Schlüsselwörter, Alternative Symbole, Di- und Trigraphs
Sachwortverzeichnis