Überblick

Ähnlich wie in C ist die Definition der Syntax nur die halbe Miete; ein wesentlicher Teil der Funktionalität des genormten Sprachumfangs steckt in der zugehörigen Bibliothek.

Dies entlastet den eigentlichen Compiler, der auch ohne Ein-/Ausgabeoperationen, komplexe Datentypen und ähnlichem schon umfangreich und aufwendig zu bauen ist.

Der Umfang der Standardbibliothek ist in C++ allerdings wesentlich größer als in C. ANSI-C enthält gut 130 relativ einfache Funktionen, verteilt auf 15 Headerdateien. Für C++ kommen nochmals einige Dutzend Headerdateien hinzu, die untereinander teilweise recht eng verzahnt sind.

Apropos Headerdateien: Weil man sich bei der Normung nicht auf eine einheitliche Dateiendung für die Headerdateien einigen konnte, nahm man den kleinsten gemeinsamen Nenner: keine Endung.

Man schreibt also nicht wie von C gewohnt ein .h in die #include-Anweisung; Beispiel:

#include <iostream>
(und nicht:
#include <iostream.h>
). Da diese endungslose Variante der Headerdateien lange diskutiert wurde, waren die meisten Hersteller schon vorgeprescht und hatten in der Erwartung von .h als Standardendung in den vorläufigen Systemen solche Dateien angeboten. Viele existierende Programme verwenden demnach diese Dateien, weshalb sie auf den meisten Systemen vorhanden sind (ohne daß dies im endgültigen Standard so vorgesehen wäre).

So kann man in aller Regel beide Versionen verwenden; allerdings gibt es einen Unterschied (siehe Namensbereiche (namespace)):

In der Standardbibliothek von C++ werden nicht nur Funktionen definiert, sondern mit den neuen Sprachmöglichkeiten gleich universell verwendbare Datentypen geschaffen (insbesondere Container) und die darauf möglichen Operationen definiert. Ein Container repräsentiert dabei eine Menge anderer Objekte, beispielsweise als Liste oder Feld (Vektor).

Dieser Teil der Standardbibliothek ist die sogenannte standard template library (STL).

Solche Container (Container) stellen beispielsweise eine Liste oder ein Feld eines anderen beliebigen Datentyps dar. Der zugrundeliegende Datentyp jedes einzelnen Elements ist nicht Gegenstand der STL, sondern vom Anwender der STL beizusteuern. Die STL implementiert also die allgemeinen Funktionen beispielsweise von Listen, und der Anwender füllt die leere Hülle (den Container) mit einem eigenen Typ. Dazu wird von templates reger Gebrauch gemacht.

Jeder dieser Container hat natürlich Möglichkeiten zum Einfügen, Löschen, und so weiter. Ein Teil der Schnittstelle ist einheitlich, so daß einige elementare Funktionalitäten mit mehreren Containern auf die selbe Art erfolgen kann.

Dies wird unter anderem für Iteratoren (siehe Iteratoren) genutzt; dies sind Objekte, mit denen man ein einzelnes Element der Gesamtmenge anfassen kann, und von einem Element zum nächsten wandern kann, ähnlich wie man in C einen Zeiger in ein Feld richten kann, und dann durch Hoch- oder Herunterzählen von einem Element zu einem anderen wandern kann. Nicht alle Container, aber zumindest die grundlegenden, ermöglichen Iteratoren.

Algorithmen (siehe Algorithmen) sind ebenfalls nicht Teil der Container, sondern operieren als templates mit den (meisten) Containern identisch. Dazu rufen sie Methoden, hauptsächlich die Iteratoren, der jeweiligen Container auf.

Mit Algorithmen kann man Operationen wie Finden, Sortieren, oder selbstdefinierte Funktionalitäten auf einzelne Objekte oder (Teil-)Mengen oder alle Elemente des Containers durchführen.

Da weder Iteratoren noch Algorithmen die Container kennen, auf denen sie operieren (sondern nur als templates einige Funktionen aufrufen, die von den Containern zur Verfügung gestellt werden müssen), kann man auch eigene Container entwerfen, und die Iteratoren und Algorithmen darauf anwenden.

Neben der STL enthält die Standardbibliothek noch einige weitere gute Geister:

Strings (siehe Strings) sind ein robuster und komfortabler Ersatz für die in C gängigen nullterminierten Zeichenketten.

Mit streams gibt es eine objektorientierte Alternative zu den gepufferten Ein-/Ausgabefunktionen aus C (fopen() etc.); siehe Streams.

Zudem werden in der Standardbibliothek Ausnahmen definiert, die von Bibliotheksfunktionen geworfen werden können, aber auch für eigene Zwecke verwendbar sind (siehe Ausnahmen der Standardbibliothek).

Die Fehlerbehandlung in der C++-Bibliothek ist nicht konsistent. Dies liegt zum einen daran, daß die einzelnen Teile aus unterschiedlichen Quellen stammen (die STL beispielsweise stammt weitgehend von Hewlett Packard) und beim Zusammenführen nicht stark verändert wurden, um einheitlicher auszusehen; zum anderen erfüllen die einzelnen Teile sehr unterschiedliche Anforderungen, sodaß eine einheitliche Fehlerbehandlung gar nicht sinnvoll ist.

Die STL ist durchgehend auf Laufzeiteffizienz getrimmt und macht so gut wie keine Fehlerüberprüfungen. Der Programmierer muß wieder wissen, was er tut und Fehlerüberprüfungen selbst machen, wo er sie für sinnvoll hält.

Streamein- und -ausgaben und string sind dagegen Beispiele für möglichst sicheres Programmieren und dementsprechend ist hier die interne Prüfung stärker und es werden bei Bedarf Ausnahmen geworfen.

Alle von ANSI-C übernommenen Funktionen (aus math.h beziehungsweise cmath, stdlib.h/cstdlib usw.) behalten dagegen ihre Fehlerbehandlung bei, um kompatibel zu bleiben und C-Programmierern das Leben zu erleichtern. Es werden Fehler also generell über den Rückgabewert von Funktionen und gegebenenfalls durch den Wert der globalen Variablen errno signalisiert.

Soweit die C++-Bibliothek über ANSI-C hinausgeht, werden Ausnahmen verwendet, die von exception abgeleitet sind; siehe Ausnahmen der Standardbibliothek.

AnyWare@Wachtler.de