Skip to main content

1995 | Buch | 3. Auflage

Programmieren in C++

Einführung in den Sprachstandard C++

verfasst von: Professor Dr. Martin Schader, Dipl.-Wirtsch.-Inf. Stefan Kuhlins

Verlag: Springer Berlin Heidelberg

Buchreihe : Objekttechnologie

insite
SUCHEN

Über dieses Buch

Das vorliegende Buch ist eine Einführung und als Nachschlagewerk zur Programmiersprache C++ geeignet. Nach den ersten Kapiteln, die den "C-Teil" von C++ behandeln, steht in der zweiten Hälfte das C++-Klassenkonzept im Vordergrund. Im einzelnen werden hier Klassen und abgeleitete Klassen, spezielle Konstruktoren, überladene Operatoren, Laufzeit-Typinformationen, Namensbereiche, parametrisierte Funktionen und Klassen sowie die Ausnahmebehandlung besprochen. Alle Sprachkonstrukte werden detailliert und an Beispielen verdeutlicht. An die Kapitel schließt sich jeweils eine Reihe von Übungsaufgaben an, deren Lösungen gegen Einsendung einer Diskette von den Autoren kostenlos erhältlich sind. Der Text enthält die kompletten C++-Syntaxregeln und einen ausführlichen Index.

Inhaltsverzeichnis

Frontmatter
1. Einleitung
Zusammenfassung
In diesem Kapitel erläutern wir die drei für die Beschreibung jeder modernen Programmiersprache wichtigen Komponenten Symbolvorrat, Syntax und Semantik. Anschließend wird die im weiteren verwendete Notation der Syntaxregeln eingeführt.
Martin Schader, Stefan Kuhlins
2. Lexikalische Konventionen
Zusammenfassung
Anhand eines ersten Beispielprogramms werden wir in diesem Kapitel in die Grundlagen von C++ einführen. Dazu stellen wir die lexikalischen Elemente: Kommentare, Bezeichner, Schlüsselwörter und Operatoren vor. Außerdem wird das Übersetzen und Ausführen eines ersten C++-Programms besprochen.
Martin Schader, Stefan Kuhlins
3. Vordefinierte Datentypen
Zusammenfassung
Wie in den meisten Programmiersprachen gibt es in C++ vordefinierte — in die Sprache eingebaute — Datentypen und die entsprechenden Operatoren. Diese Typen, die die Grundlage aller vom Programmierer selbst zusammengesetzte Typen sind, werden im folgenden Kapitel eingeführt.
Martin Schader, Stefan Kuhlins
4. Literalkonstanten
Zusammenfassung
In Abschnitt 2.2 wurde erklärt, daß die Symbolfolge, aus der sich ein C++-Programm zusammensetzt, Literalkonstanten enthalten kann. Diese beschreiben einen Wert, der sich während der Laufzeit des Programms nicht ändern kann. Sie heißen Literalkonstanten, weil ihr Wert bereits durch die Schreibweise der Konstanten ausgedrückt wird. Jede Literalkonstante hat einen zugehörigen Datentyp. Entsprechend den vordefinierten Datentypen gibt es ganzzahlige Konstanten und Zeichenkonstanten sowie Gleitpunktkonstanten. Zur einfachen Ausgabe mehrerer Zeichen stehen darüber hinaus Zeichenketten zur Verfügung. Der Compiler erkennt nicht nur den Wert sondern auch den Typ einer Literalkonstanten jeweils ohne besondere Deklaration.
Martin Schader, Stefan Kuhlins
5. Variablen und Konstanten
Zusammenfassung
Jedes C++-Programm besteht aus einer oder mehreren Dateien, die sich wiederum aus einer Folge von Deklarationen zusammensetzen. Der scheinbare Widerspruch zum Verständnis eines Programms als Folge von Anweisungen klärt sich dadurch auf, daß ausführbare Anweisungen in Funktionen enthalten sind und daß Funktionsdefinitionen selbst wieder Deklarationen sind (siehe Abschnitt 1.2 und Kapitel 11). In diesem Kapitel wird die Deklaration der Variablen und symbolischen Konstanten eines Programms behandelt.
Martin Schader, Stefan Kuhlins
6. Typumwandlungen und Ausdrücke
Zusammenfassung
Gegenstand dieses Kapitels sind Ausdrücke, mit denen alle Berechnungen in C++ formuliert werden. Ausdrücke verbinden ihre Operanden durch Operatoren. Werden in einem Ausdruck Operanden verschiedener Typen gemischt, so macht dies i.d.R. die Typumwandlung wenigstens eines Operanden notwendig. Diese Umwandlung wird implizit vom Compiler vorgenommen, kann aber auch explizit durch den Programmierer veranlaßt werden.
Martin Schader, Stefan Kuhlins
7. Anweisungen
Zusammenfassung
In diesem Kapitel behandeln wir Anweisungen, die die algorithmischen Aktionen eines Programms festlegen und die Reihenfolge, in der die Berechnungen durchgeführt werden — den sog. Kontrollfluß — steuern.
Martin Schader, Stefan Kuhlins
8. Zusammengesetzte Datentypen
Zusammenfassung
Aus den in Kapitel 3 besprochenen vordefinierten Datentypen int, double, … können vom Programmierer selbst mit Hilfe der Operatoren [], *, & und () die Datentypen Feld, Zeiger, Referenz und Funktion hergeleitet werden. Bis auf Funktionen, die in Kapitel 11 dargestellt sind, werden diese zusammengesetzten Datentypen hier behandelt.
Martin Schader, Stefan Kuhlins
9. Typumwandlungen
Zusammenfassung
In Kapitel 6 hatten wir bereits eine Reihe von Typumwandlungen besprochen, die — z.B. bei Initialisierungen oder bei der Auswertung von Ausdrücken — implizit vorgenommen werden. Bei diesen Standardkonversionen achtet der Compiler darauf, daß möglichst keine Information verloren geht (bzw. daß der Informationsverlust möglichst gering ist). Darüber hinaus hat der Programmierer die Möglichkeit, Typumwandlungen unter Umgehung der Typprüfung des Compilers vorzunehmen. Diese expliziten Typumwandlungen sind Hauptgegenstand des folgenden Kapitels.
Martin Schader, Stefan Kuhlins
10. Geltungsbereiche und Lebensdauer
Zusammenfassung
Mit den in Kapitel 5 behandelten Deklarationen werden Namen für Objekte, Funktionen, Typen usw. eingeführt. An welcher Stelle einer Programmdatei ein solcher Name verwendet werden kann, und wie lange während der Laufzeit des Programms für ihn Speicherplatz reserviert wird, ist Gegenstand der beiden folgenden Abschnitte.
Martin Schader, Stefan Kuhlins
11. Funktionen
Zusammenfassung
Um lesbare und wartbare Programme zu erhalten und um die Fehlersuche in größeren Programmen zu erleichtern, zerlegt man die Gesamtfunktionalität eines Programms in übersichtliche Teilaufgaben, die von Funktionen übernommen und gelöst werden. Durch den Aufruf von Bibliotheksfunktionen macht man sich den Inhalt der Standardbibliothek zunutze. Und bei mehrfach wiederkehrenden Anweisungsblöcken vermeidet man die erneute Aufnahme in den Programmcode. Eine Funktion kann man als benutzerdefinierte Operation ansehen. Die Beschreibung, auf welche Operanden diese Operation angewendet werden kann, wird in der Funktionsdeklaration gegeben; die Funktionsdefinition spezifiziert darüber hinaus auch die bei der Ausführung der Operation abzuarbeitenden Anweisungen.
Martin Schader, Stefan Kuhlins
12. Externe und interne Bindung
Zusammenfassung
Mit der Zerlegung der Funktionalität eines Programms in einzelne Funktionen wird auch die Aufteilung des gesamten Programms in einzelne Programmdateien möglich, die weitgehend unabhängig voneinander entwickelt werden können. Wie die Programmdateien Daten und Informationen austauschen können, ist Gegenstand dieses Kapitels.
Martin Schader, Stefan Kuhlins
13. Überladene Funktionsnamen
Zusammenfassung
Bei der Ausführung gleichartiger Operationen auf unterschiedlichen Datentypen wird oft dasselbe Operatorsymbol benutzt, wie z.B. im Fall 3 + 7 oder 3.01 + 7.12 bei der Addition von zwei int- bzw. double-Operanden. Analog dazu kann man in C++ verschiedenen Funktionen, die vergleichbare Operationen mit unterschiedlichen Argumenttypen ausführen, denselben Namen geben. Dieses Überladen eines Funktionsnamens wird im folgenden Kapitel behandelt.
Martin Schader, Stefan Kuhlins
14. Klassen
Zusammenfassung
Eine Klasse ist ein benutzerdefinierter Datentyp. In Erweiterung der Möglichkeiten bei der Definition zusammengesetzter Datentypen kann man für eine Klasse neben den Datenelementen, die sie enthält, auch eigene Operationen definieren, mit denen man auf die Daten zugreift, sie verändert, verknüpft usw. In diesem Kapitel werden die grundlegenden Vorgehensweisen zur Erzeugung und Verwendung von Klassen sowie von Variablen und Konstanten eines Klassentyps behandelt.
Martin Schader, Stefan Kuhlins
15. Spezielle Konstruktoren
Zusammenfassung
In diesem Kapitel werden der Copy-Konstruktor — eine Elementfunktion, mit der Objekte einer Klasse durch bereits existierende Objekte derselben Klasse initialisiert werden können — sowie benutzerdefinierte Umwandlungsfunktionen — die einen beliebigen Datentyp implizit in einen Klassentyp konvertieren — behandelt.
Martin Schader, Stefan Kuhlins
16. Überladene Operatoren
Zusammenfassung
In C++ ist es bis auf wenige Ausnahmen möglich, jeden Operator, z.B. +, *, ! usw. zu überladen und so dessen Funktionalität auf benutzer-definierte Datentypen auszudehnen. Dazu definiert man eine Funktion, deren Name aus dem Schlüsselwort operator und einem nachfolgenden Operatorsymbol besteht. Neue Operatoren, die die Menge der für die vordefinierten und zusammengesetzten Datentypen verfügbaren Operatoren erweitern, können nicht definiert werden.
Martin Schader, Stefan Kuhlins
17. Abgeleitete Klassen
Zusammenfassung
Die Wiederverwendung einer vollständig entwickelten Klasse B ist dadurch möglich, daß man Objekte dieser Klasse in einer neuen Klasse A definiert oder die Klasse B in die Definition von A einbettet. In beiden Fällen findet man in Objekten der Klasse A neben A-Datenelementen auch die Datenelemente von B. Auf ähnliche Weise sind die Objekte der Klasse A zusammengesetzt, wenn man A von B ableitet und die neue Klasse A dadurch definiert, daß man zu B weitere Datenelemente und Elementfunktionen hinzufügt. Darüber hinaus bieten sich im Vergleich zur Wiederverwendung durch Einbettung erheblich flexiblere Möglichkeiten, z.B. bei der Entwicklung heterogener Zeigerstrukturen mittels Standardkonversion von Zeigern und Referenzen oder durch die Definition polymorpher Klassen und Funktionen, die im Rahmen dieses Kapitels behandelt werden.
Martin Schader, Stefan Kuhlins
18. Parametrisierte Funktionen und Klassen
Zusammenfassung
Das bisher behandelte Punktions- und Klassenkonzept kann dadurch erweitert werden, daß man die entsprechenden Datentypen parametrisiert und Funktionen und Klassen „für einen beliebigen Typ“ definiert. Die benötigten speziellen Versionen werden dann bei Bedarf automatisch vom Compiler generiert.
Martin Schader, Stefan Kuhlins
19. Streams
Zusammenfassung
C++ besitzt keine vordefinierten Sprachelemente für die Ein- und Ausgabe. Statt dessen gibt es die Stream-Bibliothek, auf deren Benutzerschnittstelle in eigenen Programmen mittels der Header-Dateien iostream.h, iomanip.h und fstream.h zugegriffen werden kann. Die Stream-Bibliothek ist Bestandteil der C++-Standardbibliothek und befindet sich wie diese derzeit noch im Stadium der endgültigen Normierung. Wir werden daher in diesem Kapitel lediglich die feststehenden Grundlagen beschreiben und Hinweise zur Untersuchung der systemspezifischen Header-Dateien geben.
Martin Schader, Stefan Kuhlins
20. Ausnahmebehandlung
Zusammenfassung
In den bisherigen Beispielen waren Programmierer oft gezwungen, mögliche Laufzeitfehler (Division durch Null, Feldindex außerhalb der Grenzen usw.) bereits bei der Programmierung angemessen zu berücksichtigen. Wir hatten die entsprechenden Stellen im Programm meist nur durch // Fehlerbehandlung … angedeutet. Am einfachsten werden solche Probleme durch die Ausgabe einer Fehlermeldung, das Setzen einer globalen Fehlervariablen oder den Programmabbruch mittels exit( ) gelöst. In diesem Kapitel wird die Ausnahmebehandlung vorgestellt, mit deren Hilfe Ausnahmesituationen differenzierter bearbeitet werden können. Insbesondere ermöglicht es diese Methode den Benutzern einer Klasse, beim Aufruf von Elementfunktionen auftretende Fehler in Anwendungsprogrammen sinnvoll abzufangen — sofern von den Klassenentwicklern die dazu erforderlichen Vorkehrungen getroffen wurden.
Martin Schader, Stefan Kuhlins
21. Namensbereiche
Zusammenfassung
Alle Namen, die außerhalb sämtlicher Blöcke oder Klassen deklariert werden, sind globale Namen (vgl. Abschnitt 10.1); sie liegen im globalen Namensbereich. Hier können sich Probleme ergeben, wenn man gleichzeitig mehrere Klassenbibliotheken einsetzt und diese dieselben Namen zur Bezeichnung ihrer Klassen, Funktionen oder Konstanten verwenden. Die auftretenden Namenskonflikte können von Benutzern, denen die Bibliotheken typischerweise nur in übersetzter Form vorliegen, dann nicht gelöst werden.
Martin Schader, Stefan Kuhlins
Backmatter
Metadaten
Titel
Programmieren in C++
verfasst von
Professor Dr. Martin Schader
Dipl.-Wirtsch.-Inf. Stefan Kuhlins
Copyright-Jahr
1995
Verlag
Springer Berlin Heidelberg
Electronic ISBN
978-3-642-97630-8
Print ISBN
978-3-540-59037-8
DOI
https://doi.org/10.1007/978-3-642-97630-8