C++ ist keine neuere Version von C sondern eine völlig neue Programmiersprache.
C++ ist allerdings so angelegt, dass sie auf der Sprachdefinition von C aufbaut. C++ beinhaltet C vollständig (C ist eine
Teilmenge von C++ bzw. C++ eine Obermenge von C).
C++ besitzt also zunächst die gleichen Eigenschaften wie C - und zusätzlich einige weitere, von denen die wichtigsten
hier kurz beschrieben werden.
Falls Sie eine der folgenden Beschreibungen zu sehr verwirrt, übergehen Sie diese einfach!
Sie mögen später mit etwas mehr Erfahrung hierher zurück kommen.
- Namensräume (namespaces)
-
Namensräume bieten den Komfort, sich in einem Projekt nicht allzuviel Gedanken über einen neuen Namen in Konkurrenz
bereits vergebener Namen machen zu müssen. Man erstellt einen sinnvollen Namensraum, in welchem die Namen
(Identifier, Bezeichner) eindeutig sein müssen. Ein Bezeichner in Namensraum A kann jedoch ohne Weiteres auch
in Namensraum B vorkommen, mit anderer Zuordnung.
Auf ein Objekt mit Namen "abc" im Namensraum "spez" kann zugegriffen werden mit spez::abc.
Auf "abc" im Namensraum "allg" wird per allg::abc zugegriffen.
"::" ist der so genannte Scope-Operator (Bereichsoperator).
Ein und derselbe Namensraum kann an mehreren Stellen begonnen und beendet werden.
namespace spez // Namensraum "spez"
{
... // Hier steht üblicher Quelltext.
}
namespace allg // Namensraum "allg"
{ ... /* üblicher Quelltext */ }
namespace spez // Auch die folgenden Teile gehören zum Namensraum "spez".
{ ... /* üblicher Quelltext */ }
Wenn in einer Datei häufig auf Bezeichner eines Namensraumes zugegriffen wird, ist es ökonomischer die Verwendung
dieses Namensraumes zu vereinbaren:
using namespace spez;
Nun können alle Bezeichner in "spez" ohne "spez::" notiert werden.
- Funktionen können überladen werden.
-
Dabei können Funktionen, die im Wesentlichen die gleiche Aufgaben erfüllen,
gleiche Namen tragen. Der Compiler kann sie an unterschiedlichen Parametern unterscheiden.
Dies erleichtert das Schreiben von intuitiv lesbarem Quelltext.
- Beispiel: Angenommen, es sind die beiden folgenden Funktionen implementiert.
- int summe (int a, int b)
- nimmt zwei ganzzahlige (int) Werte entgegen und liefert ein ganzzahliges Resultat.
- float summe (float x, float y)
- nimmt zwei reelle (float) Werte entgegen und liefert ein reelles Resultat.
-
Der Funktionsname 'summe' kann nun sowohl mit ganzen als auch mit reellen Zahlen verwendet werden.
int z = summe (3, 5); weist der ganzzahligen Variablen z die Summe aus 3 und 5 zu.
float r = summe (7.4, 1.9); weist der reellen Variablen r die Summe aus 7.4 und 1.9 zu.
- Streams für den Datenfluss
-
Mit Hilfe von Streams kann vergleichsweise intuitiv Quelltext geschrieben werden,
der entsprechend verständlich gelesen werden kann.
Der Standard-Ausgabestream cout stellt Funktionen zur Verfügung,
die einen printf-Aufruf überflüsig machen.
Beispiel: cout << "Wert=" << x;
Nachteil von printf: Der Compiler kann den Formatstring nicht auf Fehler überprüfen.
Ein Konsolenstream stellt Funktionen zur Verwaltung eigener Textbildschirmbereiche zur Verfügung.
- Parameterübergabe per Referenz
- In C kann eine Referenz auf eine Variable ausschließlich per Zeiger übergeben werden.
In C++ kann ein Parameter so definiert werden, dass er zu einer übergebenen Variablen wird.
In der Funktion entfällt dann die Dereferenzierung (*).
Beispiel:
C und C++ | | nur C++ |
void vertausche(int* a, int* b)
{int c = *a;
*a = *b;
*b = c;
}
|
|
void vertausche(int& a, int& b)
{int c = a;
a = b;
b = c;
}
|
- Definition von Operatoren zur Verknüpfung von neuen Datentypen
-
Zur Verwendung neuer Datentypen können Operatoren neu definiert werden,
die mit Hilfe des Überladens ein intuitives Schreiben und Lesen eines C++ Quelltextes erleichtern.
So kann man z.B. Vektor-Objekte und dazu einen Additionsoperator '+' definieren.
Will man einem Vektor C die Summe aus zwei Vektoren A und B zuordnen, so genügt der Ausdruck 'C=A+B;'.
- Möglichkeiten zur objektorientierten Programmierung
-
In C++ kann man objektorientiert programmieren, man muss es aber nicht.
Die objektorientierte Programmierung (OOP) ist eine moderne und leistungsfähige Programmierphilosophie.
Man beschreibt die Eigenschaften und Fähigkeiten von Objekten
und lässt diese zumeist aufgrund von eintretenden Ereignissen (Tastendruck, Mausklick, ...)
möglichst selbständig agieren und kommunizieren, ohne in deren Innenleben einzugreifen.
Weiterhin können solche Eigenschaften und Fähigkeiten an spezialisiertere Objekte vererbt werden.
Die Programmierarbeit besteht fast ausschließlich im Entwerfen geeigneter Objekttypen (Klassen),
die zumeist wieder weitere Objekte nutzen. Zum Schluss liegt ein Programmobjekt (Applikation)
bereit, welches andere Objekte beinhaltet bzw. zur Laufzeit entstehen lässt.
Die Hauptfunktion braucht dieses Objekt nur zu starten, mehr nicht.
C++ sollte ursprünglich 'C mit Objekten' ('C with objects') heißen.
Das '++' bedeutet in C soviel wie 'Nachfolger von'.
Entsprechend kann C++ als Nachfolger von C interpretiert werden.
- Templates
-
Mit einem Template kann der Compiler angewiesen werden, sich eine Funktion oder eine Klasse (OOP)
so zu erstellen, dass sie mit gewünschten Datentypen umgeht.
Somit braucht man für den gleichen Algorithmus auf verschiedenen Datentypen
nicht mehr pro Datentyp eine spezielle Funktion oder Klasse zu erstellen.
- Ausnahmebehandlung
-
Tritt während eines Programmlaufs etwas nicht Verwendbares (Ausnahme, Fehler) auf,
so sollte dieses vom Programm geeignet behandelt werden.
Die Weitergabe der Ausnahmeinformation kann in C nur als Funktionsresultat oder Parameter erfolgen.
Bei verschachtelten Funktionsaufrufen kann dieser Weg unübersichtlich werden.
Außerdem ist es wenig einsichtig, z.B. zumeist das Funktionsresultat zur Weitergabe
von Ausnahmeinformationen "missbrauchen" zu müssen.
In C++ kann die Ausnahmebehandlung auf einem zusätzlichen "Bypass-Weg" eingebaut werden.
Schlüsselwörter: try, catch, throw