C++ ist eine der verbreitetsten und industriell bedeutendsten Programmiersprachen. Sie ist als Mehrzwecksprache konzipiert und unterstützt insbesondere effiziente und maschinennahe Programmierung, Datenabstraktion sowie objektorientierte und generische Programmierung.
C++ | |
---|---|
![]() | |
Basisdaten | |
Paradigmen: | generisch, objektorientiert, prozedural |
Erscheinungsjahr: | 1985, letzte Überarbeitung 2003 |
Designer: | Bjarne Stroustrup |
Entwickler: | Bjarne Stroustrup |
Aktuelle Version | C++23[1] (19. Oktober 2024) |
Typisierung: | statisch, stark |
Wichtige Implementierungen: | GNU Compiler Collection, Microsoft Visual C++, Borland C++ Builder |
Beeinflusst von: | C, Simula, Ada 83, CLU |
Beeinflusste: | Ada 95, C-Sharp, Java |
isocpp.org |
C++ basiert auf der Programmiersprache C wie in ISO/IEC 9899:1990 beschrieben. Zusätzlich zu den in C vorhandenen Möglichkeiten bietet C++ weitere Datentypen, Klassen mit Vererbung und virtuellen Funktionen, Ausnahmebehandlung, Templates (Schablonen), Namensräume, Inline-Funktionen, Überladen von Operatoren und Funktionsnamen, Referenzen, Operatoren zur Freispeicherverwaltung und mit der C++-Standardbibliothek eine erweiterte Bibliothek.
Entstehungsgeschichte
C++ wurde von Bjarne Stroustrup ab 1979 bei AT&T entwickelt. Die Idee für eine neue Programmiersprache entwickelte er aus den Erfahrungen mit der Programmiersprache Simula im Rahmen seiner Promotion. Stroustrup erschien Simula zwar geeignet für den Einsatz in großen Software-Projekten, die Struktur der Sprache erschwerte aber die für viele praktische Anwendungen erforderliche Erzeugung hocheffizienter Programme. Effiziente Programme ließen sich zwar mit der Sprache BCPL schreiben, für große Projekte war BCPL aber wiederum ungeeignet.
Als Stroustrup in den Bell-Laboratorien zu arbeiten begann, sah er sich mit dem Problem konfrontiert, den UNIX-Betriebssystemkern im Hinblick auf verteilte Programmierung analysieren zu müssen. Mit den Erfahrungen aus seiner Promotion machte er sich daran, die Programmiersprache C um ein Klassenkonzept zu erweitern, für das die Sprache Simula-67 das primäre Vorbild war.
Die Wahl fiel auf die Programmiersprache C, weil C eine Mehrzwecksprache war, schnellen Code produzierte und einfach auf andere Plattformen zu portieren war. Als dem Betriebssystem UNIX beiliegende Sprache hatte C außerdem eine nicht unerhebliche Verbreitung. Zunächst fügte er der Sprache Klassen (mit Datenkapselung) hinzu, dann abgeleitete Klassen, ein strengeres Typsystem, Inline-Funktionen und Standard-Argumente.
Während Stroustrup „C mit Klassen“ („C with Classes“) entwickelte (woraus später C++ wurde), schrieb er auch cfront, einen Compiler, der aus C mit Klassen zunächst C-Code als Zwischenresultat erzeugte. Die erste kommerzielle Version von cfront erschien im Oktober 1985.
1982 wurde C mit Klassen in C++ umbenannt. Erweiterungen darin waren: virtuelle Funktionen, Überladen von Funktionsnamen und Operatoren, Referenzen, Konstanten, änderbare Freispeicherverwaltung und eine verbesserte Typüberprüfung. Die Möglichkeit von Kommentaren, die an das Zeilenende gebunden sind, wurde wieder aus BCPL übernommen (//).
1985 erschien die erste Version von C++, die eine wichtige Referenzversion darstellte, da die Sprache damals noch nicht standardisiert war. 1989 erschien die Version 2.0 von C++. Neu darin waren Mehrfachvererbung, abstrakte Klassen, statische Elementfunktionen, konstante Elementfunktionen und die Erweiterung des Schutzmodells um protected. 1990 erschien das Buch The Annotated C++ Reference Manual, das als Grundlage für den darauffolgenden Standardisierungsprozess diente.
Relativ spät wurden der Sprache Templates, Ausnahmen, Namensräume, neuartige Typumwandlungen und boolesche Typen hinzugefügt.
Im Zuge der Weiterentwicklung der Sprache C++ entstand auch eine gegenüber C erweiterte Standardbibliothek. Erste Ergänzung war die Stream-I/O-Bibliothek, die Ersatz für traditionelle C-Funktionen wie zum Beispiel printf und scanf bietet. Eine der wesentlichen Erweiterungen der Standardbibliothek kam später durch die Integration großer Teile der bei HP entwickelten Standard Template Library (STL) hinzu.
Nach jahrelanger Arbeit wurde schließlich 1998 von der ISO die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt.
2003 wurde die erste überarbeitete Version von ISO/IEC 14882:1998 verabschiedet (ISO/IEC 14882:2003). Diese Revision ist lediglich eine Nachbesserung der Norm ISO/IEC 14882:1998 und sollte nicht mit der in Arbeit befindlichen Version verwechselt werden. Die nächste Version der Sprache C++ erscheint voraussichtlich noch in dieser Dekade. (s. in der Entwicklung befindliche Version)
Merkmale
C++ unterstützt die folgenden Programmiertechniken:
- Prozedurale Programmierung
- Modulare Programmierung
- Strukturierte Programmierung
- Programmierung mit selbstdefinierten Datentypen (abstrakte Datentypen)
- Objektorientierte Programmierung (siehe auch Polymorphie (Vielgestaltigkeit))
- Generische Programmierung mittels Templates.
C++ ist somit eine so genannte „Multiparadigmen-Sprache“, die dem Programmierer sehr viele Freiheiten lässt.
Siehe auch: Programmierparadigma, Entwurfsmuster, RAII, Metaprogrammierung
Vorteile und Nachteile
Vorteile
- Die Erzeugung hocheffizienten Codes ist möglich.
- Sowohl maschinennahe als auch hochabstrakte Programmierung ist möglich.
- Sehr hohe Ausdrucksstärke und Flexibilität – Beispiel: die anpassbare Freispeicherverwaltung, in die sich etwa nahtlos eine automatische Speicherbereinigung (englisch garbage collector) integrieren lässt.
- Für große Projekte geeignet.
- Weite Verbreitung.
- Die Sprache ist nicht im Besitz einer Firma (im Unterschied zu beispielsweise Java - Eigentum der Firma SUN oder Visual Basic - Eigentum der Firma Microsoft). Standardisierung durch die ISO
- Weitreichende Möglichkeiten für die Metaprogrammierung
- Kompatibilität mit C – Vorteil: Es steht eine breite Codebasis zur Verfügung.
- Die aktuellen Frameworks für C++ sind recht weit entwickelt und einige wie z. B. Qt sind plattformübergreifend.
Nachteile
- Historischer Ballast muss aufgrund der Kompatibilität mit C mitgeschleppt werden, zum Beispiel der von C übernommene Präprozessor, oder die teilweise schwer verständliche C-Syntax. Die Kompatibilität zu C hat u. a. zur Folge, dass einige Details der Sprache Compiler-spezifisch sind, die es aber nicht sein müssten. So ist beispielsweise die Auswertungsreihenfolge von Teilausdrücken je nach Compiler und Plattform unterschiedlich. Dies erschwert die Portierung von C++-Programmen zwischen Rechnertypen, Betriebssystemen und unterschiedlichen Compilern.
- Die aktuellen Compiler (Stand: 2005) sind rückständig bezüglich der Umsetzung der ISO-Norm.
- Die aktuellen Compiler produzieren nicht immer optimalen Code, sowohl in Bezug auf Geschwindigkeit als auch auf Code-Größe.
- Zum Erlernen sind verhältnismäßig lange Einarbeitungszeiten erforderlich.
- Die aktuelle C++-Standardbibliothek deckt einige neue Erfordernisse noch nicht ausreichend ab, zum Beispiel Threads, TCP/IP, Dateisystem-Verzeichnisse. Deshalb besteht in diesen Bereichen, bei Verwendung herstellerspezifischer Bibliotheken, eine eingeschränkte Portabilität über Betriebssystemgrenzen hinweg (Entwicklung zahlreicher externer Bibliotheken).
- Aufgrund des breiten Leistungspektrums und der vielfältigen Gestaltungsmöglichkeiten ist die Verwendung von Programmierrichtlinien (aus Gründen der Wartbarkeit und Fehleridentifizierung) mehr als in anderen Sprachen anzuraten.
Hallo-Welt-Programm in C++
Der folgende Quelltext stellt ein einfaches C++-Programm dar, das die Meldung „Hallo Welt!“ auf dem Standardausgabemedium ausgibt:
#include <iostream> int main() { std::cout << "Hallo Welt!" << std::endl; }
Erläuterungen
Bei main handelt es sich um eine Funktion, genauer gesagt ist es die Hauptfunktion des gesamten Programms. Die Funktion main ist in jedem C++-Programm vorhanden und wird nach dem Start des Programms aufgerufen.
Die C++-ISO-Norm schreibt vor, dass das Ergebnis von main vom Typ int sein muss. Ein Programm, bei dem das Ergebnis von main nicht vom Typ int ist, ist kein gültiges Programm im Sinne der C++-ISO-Norm (ISO-14882).
Die Funktion main ist die einzige Funktion, die – obwohl sie einen Wert zurückgibt – nicht die Anweisung „return“ benötigt. Ohne die explizite Anweisung return gibt main den Wert 0 zurück.
Verwandtschaft mit C
C++ ist eine Erweiterung der Programmiersprache C gemäß dem Stand von 1990 (ISO/IEC 9899:1990, auch kurz C90 genannt). C++ enthält C nach dem Stand C90 fast vollständig. Einige wenige C-Programme lassen sich nicht ohne weiteres als C++ kompilieren beziehungsweise haben als C++-Programme eine etwas andere Bedeutung. Dabei handelt es sich aber um Sonderfälle, die in der Praxis keine große Rolle spielen.
Die Kompatibilität mit C war eines der Hauptdesignziele bei der Entwicklung der Programmiersprache C++. Grund dafür war die große Verbreitung von C. C-Compiler sind auch heute noch für praktisch jeden Prozessor verfügbar. Deswegen gilt die Kompatibilität mit C immer noch als eine der wichtigsten Eigenschaften von C++.
Im Laufe der Entwicklung der beiden Sprachen gab es auch Rückwirkungen von C++ auf C. Beispielsweise wurden in C const sowie die Funktionsprototypen von C++ übernommen.
Die letzten Änderungen an C fanden 1999 statt (ISO/IEC 9899:1999). Gemäß dem Ratifizierungsjahr 1999 spricht man, wenn man sich auf diesen C-Stand bezieht, deshalb auch von C99. Ein Beispiel für darin eingeführte Spracherweiterungen sind die so genannten VLAs (engl. variable length array).
Aufgrund dieser Weiterentwicklung von C gibt es theoretisch mehr Inkompatibilitäten zwischen C und C++. Mittlerweile unterstützen viele Compiler diesen neuen Stand C99 in der Sprachdefinition und nicht ganz so viele auch in der Bibliothek, so dass die Bedeutung dieser Unterschiede zwischen C und C++ zunimmt. Bei der in Arbeit befindlichen C++-Version wird u. a. daran gearbeitet, die neuen C99-Merkmale mit einzuarbeiten. Einige C++-Compiler unterstützen C99-Neuerungen schon jetzt (z. B. der gcc).
Vergleich mit anderen Sprachen
C++ war nicht der einzige Ansatz, die Programmiersprache C um Eigenschaften zu erweitern, die das objektorientierte Programmieren vereinfachen. In den 1980er Jahren entstand die Programmiersprache Objective-C, die sich aber im Gegensatz zu C++ an Smalltalk und nicht an Simula orientierte. Die Syntax von Objective-C unterscheidet sich unter anderem wegen der Smalltalk-Wurzeln stark von C++. Objective-C ist weniger weit verbreitet als C++. Bekannteste Einsatzgebiete von Objective-C sind in OpenStep und Mac OS X.
Die Programmiersprachen Java und C# haben eine ähnliche, ebenfalls an C angelehnte Syntax wie C++, sind auch objektorientiert und unterstützen Typparameter, weshalb ein Vergleich mit ihnen besonders naheliegend ist.
Siehe auch: Simula, Smalltalk, Vergleich objektorientierter Programmiersprachen
In der Entwicklung befindliche Version
Im Jahr 2003 erschien eine Ergänzung des Standard (ISO/IEC 14882:2003), deren Inhalt zum C++98 gehört. C++0x (manchmal auch C++200x) ist eine inoffizielle Abkürzung für die in der Entwicklung befindliche Version der Programmiersprache C++. Zwar scheint der Name anzudeuten, dass dieser Standard bis spätestens 2009 fertig gestellt wird, es handelt sich aber lediglich um eine grobe Einschätzung des möglichen Erscheinungstermins.
Der Name „C++“
Der Name ist eine Wortschöpfung von Rick Mascitti und wurde zum ersten Mal im Dezember 1983 benutzt. Während ihrer Entstehung wurde die Sprache zuerst „C with Classes“ genannt. Der endgültige Name kommt vom Operator „++“, der den Wert einer Integer-Variablen um eins erhöht (siehe Inkrement und Dekrement).
Zersplitterung der Sprachbenutzung, Implementierung und Spezifizierung
Im Gegensatz zu vielen anderen neueren Programmiersprachen ist C++ nur eine Spezifikation (sogar ein ISO-Standard), ohne eine Referenz-Implementierung. Das hat den Vorteil, dass man bei der Benutzung von C++ nicht an einen Hersteller gebunden wird und eine große Anzahl an Implementierungen existiert. Ein enormer Nachteil ist aber die langsame Umsetzung der Spezifikationen in den Implementierungen. Zwar entwickelt sich C++ in langsamen Schritten weiter, seit 1997 erfolgten nur noch Fehlerkorrekturen, aber dennoch dauerte es lange bis der C++-Standard weitestgehend unterstützt wurde. Heutige Inkompatibilitäten beziehen sich in der Regel nur auf das Sprachmittel „export
“.
Ein weiterer Grund für die Zersplitterung der Sprache ist die lange Benutzung. C++ wurde in der Phase, in der die Sprache die größte Entwicklung erlebte, bereits sehr intensiv eingesetzt. Dies sorgte dafür, dass viele Entwickler nicht oder nur unzureichend mit neueren Eigenschaften der Sprache vertraut sind oder diese auf Grund von alten Compilern nicht einsetzen konnten. Daher sind viele Projekte, die in C++ entwickelt wurden, nicht auf dem aktuellen Stand der C++ Programmierung und sogar inkompatibel zu den aktuellen C++-Normen.
Auch der Stand vieler Lehrbücher und Lehrveranstaltungen ist veraltet. Da sich einige Compiler, wie der GCC, der C++-Sprachdefinition immer mehr annähern, stimmen Lehrinhalte oft nicht mit der Realität existierender Compiler überein.
C++-Compiler
Compiler | Kommentar | Mit spezieller IDE | Plattform |
---|---|---|---|
g++ | Bestandteil der GCC; setzt ab Version 3.4 die Sprache C++ nahezu vollständig um; Freie Software | Nein | Unix, Linux, Mac OS X, Windows (dort auch als MinGW), AmigaOS |
Intel C++ Compiler | Setzt C++ nahezu vollständig um; erzeugt hocheffizienten Code für Intel-Prozessoren; proprietär | Nein | Windows, Linux |
Microsoft Visual C++ | Verbreitetster Compiler unter Windows; setzt ab der Version 7.1 die Sprache C++ nahezu vollständig um; proprietär; kostenlose Version mit Einschränkungen | Ja | Windows |
Borland C++ Builder | proprietär (eine ältere Version ist kostenlos ohne IDE verfügbar) | Ja | Windows, Linux (Kylix) |
Open Watcom | Auch Unterstützung älterer Plattformen, bisher noch ohne vollständige C++-Standardbibliothek; Open Source | Ja | DOS, Windows, OS/2, Netware (Linux-Unterstützung in Arbeit) |
Comeau's C++ Compiler | Gilt als der Compiler, der C++ vollständig umsetzt; unterstützt zum Beispiel auch export von Templates; proprietär (kann über das Internet ausprobiert werden) | Nein | Windows, Linux, Solaris/SPARC |
Für Kommandozeilen-Compiler die keine spezielle integrierte Entwicklungsumgebung mitbringen, existieren eine große Zahl von unabhängigen Werkzeugen, die die Entwicklung sehr erleichtern. Eine Liste derer findet man im selbigen Artikel.
Siehe auch: Compiler, Visuelle Programmierumgebung
Siehe auch
- Boost
- C++-Glossar
- C++-Standardbibliothek
- Templates (Schablonen)
- C++-Metaprogrammierung (siehe auch Metaprogrammierung)
- C++/CLI.
- RAII (resource acquisition is initialization)
- Escape-Sequenz
- Programmiersprache C
Literatur
- Bjarne Stroustrup: Die C++-Programmiersprache, Addison-Wesley, ISBN 3-8273-1660-X, das Standardwerk zu C++, Grundkenntnisse in C von Vorteil.
- Andrew Koenig, Barbara E. Moo: Intensivkurs C++, Pearson Studium, ISBN 3-8273-7029-9, Anfängerbuch, ein gewisses Grundverständnis der Programmierung ist von Vorteil.
- Scott Meyers: Effektiv C++ Programmieren – 55 Möglichkeiten, Ihre Programme und Entwürfe zu verbessern, Addison-Wesley, ISBN 3-8273-2297-9, zur Vertiefung bereits vorhandener C++-Kenntnisse.
- Scott Meyers: Mehr Effektiv C++ programmieren – 35 neue Wege zur Verbesserung ihrer Programme und Entwürfe, Addison-Wesley, ISBN 3-8273-1275-2, Vertiefung vorhandener C++-Kenntnisse.
- Herb Sutter: Exceptional C++, ISBN 3-8273-1711-8, Vertiefung vorhandener C++-Kenntnisse.
- Andrei Alexandrescu: Modernes C++ Design – Generische Programmierung und Entwurfsmuster angewendet, ISBN 3-8266-1347-3, ein Standardwerk zur C++-Metaprogrammierung, setzt ein tiefes Verständnis von C++ voraus.
- Bruce Eckel: Thinking in C++, Volume 1: Introduction to Standard C++, Prentice Hall, 2000, ISBN 0139798099, auch als kostenloses online-Buch verfügbar
- Bruce Eckel: Thinking in C++, Vol. 2: Practical Programming, Prentice Hall, 2003, ISBN 0130353132, auch als kostenloses online-Buch verfügbar, sehr gute Beispiele als Quelltext
Weblinks
- Linksammlung zu vielen C++ - Themen
- Oft gestellte Fragen und Antworten, englisch
- Webauftritt des C++-Standardisierungskomitees, englisch
- C++-Diskussionsgruppe, deutsch
- C++-Online-Referenz, englisch
- ACCU, internationale Interessengemeinschaft für C und C++
- Ian Joyner: „C++??“ – Kritik an C++
- ↑ ISO/IEC 14882:2024 - Programming languages — C++. 19. Oktober 2024.