Sie sind hier: Buchauszüge Inhaltsverzeichnis  
 BUCHAUSZÜGE
Vorwort
Inhaltsverzeichnis
Einführung
Typwandlungen

INHALTSVERZEICHNIS
 
VORWORT

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