Mit C++ steht dem professionellen Programmierer eine faszinierende Sprache zur Verfügung: ob lowlevel oder highlevel-Programme, also: ob sehr nahe an der Hardware oder sehr weit davon entfernt, ob technisch oder kommerzielle Applikation, die Sprache ist so flexibel, dass Sie in jedem Applikationsgebiet effizient eingesetzt werden kann.
C++ Compiler stehen für alle gängigen Betriebssysteme zur Verfügung: von Microsoft Windows über Apple Mac OS X zu Linux und Unix bis hin zu IBM Betriebssystem.
Die Einführung in die objektorientiert Programmierung klärt zunächst, warum das Paradigma so interessant ist und welche Vorteile es bringt. Diese Motivation geschieht indem dargelegt wird, warum komplexe Architekturen (wie zum Beispiel Betriebssysteme und Datenbanken) von der Objektorientierung profitieren können. Dies hängt auch damit zusammen, dass der Designschwerpunkt auf die Architektur eines Programms gelegt wird, gleichzeitig die Produktivität und die Sicherheit zunehmen und letztlich eine besser Wertbarkeit und Erweiterbarkeit einstellen. Nachdem in der Einführung diese Aspekte und Vorteile dargelegt werden, wenden wir uns der Programmiersprache zu.
Zunächst werden die Grundlagen aufgebaut und die Programmiersprache C als Basis von C++ vollständig behandelt. Darin enthalten sind alle Kontrollstrukturen und die einfachen, skalaren Datentypen bis hin zu den Zeigern.
Im nächsten Schritt werden die elementaren Prinzipien und Paradigmen der Objektorientierung systematisch aufbereitet. Einstudiert werden Klassen, Objekte, Elementfunktionen und die einfache Vererbung. Damit ist der Lernende befähigt und in der Lage fundiert Mitzusprechen (und Mitzuprogrammieren) wenn es um die Objektorientierung geht.
Im letzten Drittel wird die Stufe des Experten erklommen: jetzt werden fortgeschrittene Konzepte behandelt. Gegenstand der Betrachtung sind die Mehrfachvererbung, die wiederholte Vererbung, die virtuelle Vererbung, die Operatorüberladung und der Latebinding Polymorphismus.
Nachdem diese Konzepte sitzen wird die generische Programmierung mit Hilfe von Templates besprochen und gezeigt. Das Ziel ist, mit Klassentemplates und Funktionstemplates, die Produktivität des Programmierers und die Sicherheit der Programme dramatisch zu steigern.
Vor diesem Hintergrund ist der Umgang mit Ausnahmen und Fehlern nicht weniger bedetend. Dem tragen wir Rechnung, indem das Exceptionhandling, also die Ausnahmenbehandlung, sorgfältig eingeführt und erläutert wird.
Inhaltsverzeichnis
1 Prêt-á-porter oder Haute Couture?
1.1 Warum objektorientierte Betriebssysteme?
1.2 Warum objektorientierte Datenbanken?
1.3 Warum objektorientierte Programmierung?
1.3.1 Rapid Prototyping und schrittweise Verfeinerung
1.3.2 Designschwerpunkt liegt auf der Architektur
1.3.3 Produktivität und Sicherheit nehmen zu
1.3.4 Bessere Wartbarkeit und Erweiterbarkeit
1.4 Ojektorientierte Analyse und objektorientiertes Design?
2 Take off: Die Sprache C++
2.1 Für wen ist C++?
2.2 C und C++ sind sich sehr ähnlich
2.3 C und C++ sind sehr verschieden voneinander
2.4 Historie von C++
3 Die Basis von C++ - das klassische C
3.1 Die C++-Fibel
3.1.1 Wie C-Programme aufgebaut sind
3.1.2 Blockkonzept
3.1.3 Datentypen
3.1.3.1 Skalare Datentypen
3.1.3.2 Zusammengesetzte Datentypen
3.1.3.3 Speicherklassen
3.1.3.4 Typkonvertierung
3.1.4 Kontrollstrukturen
3.1.4.1 Wiederholungen
3.1.4.2 Selektionsanweisungen
3.1.4.3 Kontrolltransferanweisungen
3.1.4.4 Befehle zur Heapverwaltung
3.1.5 Operatoren
3.1.6 Der Präprozessor
3.1.6.1 Das Arbeiten mit symbolischen Konstanten.
3.1.6.2 Das Arbeiten mit Makros
3.1.6.3 Der String-Generator (string creation operator) #
3.1.6.4 Der Token-Verknüpfer (token concatenation operator; token pasting) ##
3.1.6.5 Das Arbeiten mit Include-Dateien
3.1.6.6 Die bedingte Compilierung
3.1.7 Moderne Architekturen mit traditionellen Bausteinen?
3.2 Basiserweiterungen von C++ gegenüber dem klassischen C
3.2.1 Kommentare
3.2.2 Aufzählungs-Namen und Struktur-Namen
3.2.3 Definitionen im Blockinneren
3.2.4 Sichtbarkeitsoperator
3.2.5 Das Schlüsselwort const
3.2.6 Explizite Typkonvertierung
3.2.7 Funktions-Prototypen
3.2.8 Überladung von Funktionsnamen
3.2.9 Default-Parameter
3.2.10 Prototypen zu Funktionen mit Default-Parameter
3.2.11 Funktionen mit variablen Argumentlisten
3.2.12 Der Datentyp va_list
3.2.13 Die Makros va_start(), va_arg() und va_end()
3.2.14 Der Referenz-Operator
3.2.15 Funktionen mit Referenzparameter
3.2.16 Referenzen als Ergebnistyp von Funktionen
3.2.17 Das Schlüsselwort inline: Inline-Funktionen
3.2.18 Die Operatoren new und delete
3.2.19 Wenn der Heap-Speicher verbraucht ist
3.2.20 new, delete und Klassen
3.2.21 void-Pointer und void-Funktionen
4 Klasse, Objekt und Botschaft
4.1 Kapselung und abstrakter Datentyp
4.1.1 Klassen und Objekte
4.1.2 Abstrakte Klassen (abstract, deferred, pure classes)
4.1.3 static-Attribute, static-Elementfunktionen
4.2 Der Botschaftenmechanismus
4.3 Klassen und Objekte inneinander geschachtelt („Aggregation“)
5 Einfache Vererbung
5.1 Die Vererbung als zentrales Strukturierungsprinzip
5.1.1 Ähnlichkeiten zwischen Klassen
5.1.2 Vererbung: Strukturierung und Produktivitätssteigerung
5.2 Verschiedene Arten der Vererbung
5.3 Beispiel: die Klasse vektor erbt von der Klasse array
5.4 Der Destruktor
5.5 Der this-Zeiger
5.6 Aufruf des Basisklassenkonstruktors
5.7 Typische Modulstruktur, wenn Vererbung genutzt wird
6 Fortgeschrittene Möglichkeiten der Vererbung
6.1 Die "Erbschaft" verkleinern
6.2 Die Mehrfachvererbung
6.3 Die wiederholte Vererbung
6.4 Virtuelle Basisklassen und virtuelle Vererbung
6.5 Abstract, deferred, pure class und pure virtual functions
7 Polymorphismus
7.1 Early-Binding-Polymorphismus
7.2 Funktionsüberladung
7.3 Operatorüberladung
7.3.1 Operatorfunktionen als Elementfunktionen von Klassen
7.4 Freund-Funktionen (friend functions)
7.5 Late-Binding-Polymorphismus
8 Ausnahmebehandlung (Exceptionhandling)
8.1 Das Prinzip der Ausnahmebehandlung
8.1.1 Ausnahmeklassen
8.1.2 Der throw-Ausdruck löst den Ausnahmezustand aus
8.1.3 Der try Block
8.1.4 Mit catch wird der Ausnahmezustand abgefangen
8.1.5 Lebensdauer von Ausnahmeobjekten
8.1.6 Explizite Deklaration
8.1.7 terminate(), set_terminate(), unexpected() und set_unexpected()
9 Templates
9.1 Klassen-Templates
9.1.1 Ein einfaches Klassen-Template
9.1.2 Ein Klassen-Template mit mehreren Parametern
9.2 Funktions-Templates
9.3 Container-Klassen
9.4 Generische Container
10 iostream Ein-/Ausgabe
10.1 Die Ausgabe
10.1.1 Ausgabe-Manipulatoren
10.1.2 Ausgabe-Formatflags
10.2 Die Eingabe
10.2.1 Eingabe-Manipulatoren
10.2.2 Eingabe-Formatflags
10.2.3 istream-Elementfunktionen für die unformatierte Eingabe
10.3 Die Datei-Ein-/Ausgabe
10.3.1 Statusabfragen
11 Glossar
12 Register
13 Über den Autor
Zielsetzung & Themen
Das Ziel dieses Buches ist es, professionelle Programmierer in die Sprache C++ sowie in die grundlegenden Konzepte der objektorientierten Programmierung einzuführen, indem der Sprachkern von C++ anhand praxisnaher Beispiele vermittelt wird.
- Grundlagen und Implementierung des objektorientierten Ansatzes in C++
- Vergleich und Einbindung von prozeduralem C in C++
- Verständnis und Anwendung von Vererbung, Polymorphismus und Ausnahmebehandlung
- Einsatz von Templates für generische Programmierung und Container-Klassen
- Effiziente Nutzung der iostream-Bibliothek für Ein- und Ausgabeprozesse
Auszug aus dem Buch
1 Prêt-á-porter oder Haute Couture?
Kaum ein anderes Schlagwort beschäftigt die Softwerker mehr: Objektorientiertheit zieht sich wie ein roter Faden durch die Informatikwelt. Objektorientierte Betriebssysteme sind die Basis: darauf laufen objektorientierte Datenbanken, natürlich mit einer objektorientierten Programmiersprache geschrieben, nachdem vorher eine objektorientierte Analyse und ein objektorientiertes Design durchgezogen wurden. Zum Benutzer hin lacht eine objektorientierte, graphische Oberfläche. Und die Gestalt vor dem Computer denkt selbstverständlich objektorientiert! So mag es einem vorschweben - Objektorientiertheit als prêt-á-porter für alle. Die Realität sieht noch anders aus. Objektorientiertheit ist wohl zur Zeit eines der faszinierendsten und gleichzeitig am wenigsten verstandenen Informatik-Paradigmen: Objektorientiertheit ist heute noch eher in der Haute Couture der Softwareschneidereien zu finden.
Diese Serie soll mithelfen, diesen Zustand zu ändern. In der Objektorientiertheit liegt die Chance, der Softwareherstellung einen ungeahnten Produktivitätsschub zu geben. Die Objektorientiertheit darf schon aus diesem Grund kein Privileg der Großmeister bleiben, sie muss Allgemeingut in den Köpfen aller Informatiker werden, egal ob Analytiker, Designer oder Programmierer.
Bevor wir uns dem objektorientierten Programmieren zuwenden, wollen wir zuerst die strategische und tiefere Bedeutung der Objektorientiertheit verdeutlichen. Dieser veränderte Denkansatz, der Daten und Funktionen als untrennbare Einheit, eben als Objekt (siehe Bild), in den Mittelpunkt der Betrachtung stellt, ist jedoch keineswegs nur um seiner selbst willen interessant! Die damit erreichbaren Ziele versprechen einen enormen Fortschritt im Softwarebau. Dies wollen wir anhand der Fragestellung ausloten, warum die weiter unten erwähnten objektorientierten Betriebssysteme und Datenbanken so wünschenswert sind.
Kapitelübersichten
1 Prêt-á-porter oder Haute Couture?: Führt in die strategische Bedeutung der Objektorientiertheit ein und begründet ihren Nutzen für moderne Systemarchitekturen.
2 Take off: Die Sprache C++: Bietet einen Überblick über die Sprache C++, ihre Historie und ihre Eignung für professionelle Softwareentwickler.
3 Die Basis von C++ - das klassische C: Behandelt den konventionellen C-Sprachkern, inklusive Datentypen, Kontrollstrukturen und des Präprozessors, als Basis für C++.
4 Klasse, Objekt und Botschaft: Erläutert die zentralen Säulen der Objektorientierung: Kapselung, Klassen, Objekte und den Botschaftenmechanismus.
5 Einfache Vererbung: Führt das Konzept der Vererbung als Strukturierungsprinzip zur Produktivitätssteigerung ein.
6 Fortgeschrittene Möglichkeiten der Vererbung: Vertieft Themen wie Mehrfachvererbung, wiederholte Vererbung und virtuelle Basisklassen.
7 Polymorphismus: Erklärt statischen und dynamischen Polymorphismus sowie Funktions- und Operatorüberladung.
8 Ausnahmebehandlung (Exceptionhandling): Beschreibt moderne Strategien zur Fehlerbehandlung mittels Exceptions.
9 Templates: Führt generische Programmierung durch Klassen- und Funktions-Templates ein.
10 iostream Ein-/Ausgabe: Erläutert die moderne objektorientierte Ein-/Ausgabe-Bibliothek im Vergleich zu stdio.
Schlüsselwörter
C++, Objektorientierung, Vererbung, Polymorphismus, Klassen, Kapselung, Ausnahmebehandlung, Templates, Container-Klassen, iostream, Programmierung, Softwarearchitektur, Typkonvertierung, Operatorüberladung, Datenabstraktion.
Häufig gestellte Fragen
Worum geht es in diesem Buch grundsätzlich?
Das Buch dient als umfassender Leitfaden für professionelle Programmierer, die C++ erlernen und die objektorientierte Programmierung effektiv in ihren Projekten einsetzen wollen.
Was sind die zentralen Themenfelder?
Zu den Schwerpunkten gehören der Sprachkern von C++, objektorientierte Paradigmen wie Vererbung und Polymorphismus, die Ausnahmebehandlung sowie moderne Konzepte wie Templates.
Was ist das primäre Ziel des Buches?
Ziel ist es, den Leser vom prozeduralen C-Denken hin zur objektorientierten Softwarekonstruktion zu führen und dabei die technologischen Vorteile der Objekttechnik aufzuzeigen.
Welche wissenschaftliche Methode wird verwendet?
Das Buch verfolgt einen pragmatischen, softwaretechnischen Ansatz, der Konzepte durch direkte Gegenüberstellungen von traditionellem C und den Erweiterungen in C++ sowie durch konkrete Codebeispiele vermittelt.
Was wird im Hauptteil behandelt?
Der Hauptteil gliedert sich in die Einführung des C-Grundgerüsts, die detaillierte Darstellung von Klassen, Vererbung, Polymorphismus und fortgeschrittene Themen wie Exceptionhandling und Templates.
Welche Schlüsselwörter charakterisieren die Arbeit?
Die Arbeit lässt sich durch Begriffe wie C++, Objektorientierung, Vererbung, Polymorphismus, Templates und Softwarearchitektur charakterisieren.
Welchen Stellenwert nimmt die "hybride Natur" von C++ ein?
Die hybride Natur – bestehend aus prozeduralem C-Kern und objektorientierten Erweiterungen – wird als strategischer Vorteil bewertet, da sie Entwicklern erlaubt, schrittweise in die objektorientierte Welt zu wachsen.
Warum ist die Unterscheidung zwischen Early-Binding und Late-Binding wichtig?
Die Unterscheidung ist für das Verständnis der Polymorphismus-Umsetzung in C++ entscheidend: Early-Binding erfolgt zur Übersetzungszeit (statisch), während Late-Binding die flexible, dynamische Auswahl zur Laufzeit ermöglicht.
- Quote paper
- Prof. Dipl.-Inform. Johann Anton Illik (Author), 2009, Professional Programmer Series: C/C++, Munich, GRIN Verlag, https://www.grin.com/document/122680