Zum Inhalt springen

„C++“ – Versionsunterschied

aus Wikipedia, der freien Enzyklopädie
[ungesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
K Änderungen von 193.246.113.30 (Diskussion) auf die letzte Version von Dunkelflaute zurückgesetzt
Markierung: Zurücksetzung
 
Zeile 1: Zeile 1:
{{Falscher Titel|Titel=C++}}
'''C++''' ist eine [[Programmiersprache]] für allgemeine Anwendungen und stellt Sprachmittel für [[abstrakter Datentyp|abstrakte Datentypen]] sowie [[modulare Programmierung|modulare]], [[generische Programmierung|generische]], [[objektorientierte Programmierung|objektorientierte]] und [[strukturierte Programmierung|strukturierte]] Programmierung zur Verfügung. C++ basiert auf der [[C (Programmiersprache)|Programmiersprache C]] wie in [[International Organization for Standardization|ISO]]/IEC 9899:1990 beschrieben.


{{Infobox Programmiersprache
Zusätzlich zu den in [[C (Programmiersprache)|C]] vorhandenen Möglichkeiten bietet C++ weitere [[Datentyp]]en, [[objektorientierte Programmierung#Klassen|Klassen]] mit [[Vererbung (objektorientierte Programmierung)|Vererbung]] und [[virtuelle Funktion|virtuellen Funktionen]], [[Ausnahme (EDV)|Ausnahmebehandlung]], [[Template (Programmierung)|Templates (Schablonen)]], [[Namensraum|Namensräume]], [[Inline-Ersetzung|Inline-Funktionen]], [[Überladen]] von [[Operator]]en und Funktionsnamen, [[Referenz (Programmierung)|Referenzen]], Operatoren zur [[Freispeicher (Programmierung)|Freispeicherverwaltung]] und mit der [[C-Plusplus-Standardbibliothek|C++-Standardbibliothek]] eine erweiterte [[Bibliothek (Programmierung)|Bibliothek]].
| Name =
| Logo = [[Datei:ISO C++ Logo.svg|150px|alt=C++-Logo]]
| Beschreibung = Logo der Programmiersprache C++
| Paradigma = Multiparadigmen ([[Generische Programmierung|generisch]], [[Imperative Programmierung|imperativ]], [[Objektorientierte Programmierung|objektorientiert]], [[Prozedurale Programmierung|prozedural]], [[Strukturierte Programmierung|strukturiert]], [[Funktionale Programmierung|funktional]])
| Erscheinungsjahr = <!-- Wikidata -->
| Designer = <!-- Wikidata -->
| Entwickler = <!-- Wikidata -->
| AktuelleVersion = <!-- Wikidata -->
| AktuelleVersionFreigabeDatum = <!-- Wikidata -->
| AktuelleVorabVersion = C++ 26
| AktuelleVorabVersionFreigabeDatum =
| Typisierung = [[Statische Typisierung|statisch (dynamische Typprüfung möglich)]], implizit, [[Typisierung (Informatik)|stark]]
| Implementierung = [[C++Builder]], [[GNU Compiler Collection|GCC]], [[Microsoft Visual C++|MS Visual C++]], [[Intel C++ Compiler]], [[Clang|Clang/LLVM]]
| Dialekte =
| Standardisierungen = ISO/IEC 14882:1998,<br />ISO/IEC 14882:2003,<br />ISO/IEC TR 19768:2007,<br />ISO/IEC 14882:2011,<br />ISO/IEC 14882:2014<ref name="ISO14882-2014">{{Internetquelle |url=http://www.iso.org/iso/catalogue_detail.htm?csnumber=64029 |titel=ISO/IEC 14882:2014 – Information technology -- Programming languages -- C++ |werk=www.iso.org |datum=2014-12 |abruf=2018-09-22}}</ref>,<br />ISO/IEC 14882:2017<ref name="ISO14882-2017">{{Internetquelle |url=http://www.iso.org/iso/catalogue_detail.htm?csnumber=68564 |titel=ISO/IEC 14882:2017 – Programming languages -- C++ |werk=www.iso.org |datum=2017-12 |abruf=2018-09-22}}</ref>,<br />ISO/IEC 14882:2020<ref name="ISO14882-2020">{{Internetquelle |url=https://www.iso.org/standard/79358.html |titel=ISO/IEC 14882:2020 - Programming languages -- C++ |datum=2020-12 |abruf=2021-10-21}}</ref>,<br />ISO/IEC 14882:2024<ref name="ISO14882-2024">{{Internetquelle |url=https://www.iso.org/standard/83626.html |titel=ISO/IEC 14882:2024 - Programming languages -- C++ |datum=2024-10 |abruf=2025-02-09}}</ref>
| Beeinflusst_von = <!-- Wikidata -->
| Beeinflusste = [[Ada 95]], [[Chapel (Programmiersprache)|Chapel]], [[C-Sharp|C#]], [[D (Programmiersprache)|D]], [[Go (Programmiersprache)|Go]], [[Java (Programmiersprache)|Java]], [[Nim (Programmiersprache)|Nim]], [[Perl (Programmiersprache)|Perl]], [[PHP]], [[Python (Programmiersprache)|Python]]<ref>{{Internetquelle |url=https://docs.python.org/tutorial/classes.html |titel=9. Classes — Python 3.6.4 documentation |werk=docs.python.org |abruf=2018-05-17}}</ref>, [[Vala (Programmiersprache)|Vala]], [[Rust (Programmiersprache)|Rust]], [[Seed7]]
| Betriebssystem =
| Lizenz =
| Website = <!-- Wikidata -->
}}


'''C++''' ist eine von der [[Internationale Organisation für Normung|ISO]] genormte [[Programmiersprache]]. Sie wurde ab 1979 von [[Bjarne Stroustrup]] bei [[AT&T]] als Erweiterung der Programmiersprache [[C (Programmiersprache)|C]] entwickelt. C++ ermöglicht sowohl die [[Effizienz (Informatik)|effiziente]] und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau. Der Standard definiert auch eine Standardbibliothek, zu der verschiedene Implementierungen existieren.
== Entstehungsgeschichte ==


== Einsatzgebiete ==
C++ wurde von [[Bjarne Stroustrup]] ab [[1979]] bei [[AT&T]] entwickelt. Die Idee für eine neue Programmiersprache entstand dabei aus den Erfahrungen, die er während seiner Promotionsarbeit gesammelt hatte. Stroustrup fand die Sprache [[Simula]] hilfreich für die Entwicklung großer Software-Projekte, für praktische Anwendungen war sie aber zu langsam in der Ausführung. Demgegenüber war die Sprache [[BCPL]] zwar schnell, aber zu maschinennah und nicht geeignet für die Entwicklung großer Software-Projekte.
C++ wird sowohl in der [[Systemprogrammierung]] als auch in der [[Anwendungsprogramm]]ierung eingesetzt und gehört in beiden Bereichen zu den verbreitetsten Programmiersprachen.<ref>{{Internetquelle |url=http://www.lextrait.com/vincent/implementations.html |titel=The Programming Languages Beacon |werk=lextrait.com |sprache=en |abruf=2018-01-21}}</ref>


=== Systemprogrammierung ===
Als Stroustrup in den [[Bell Laboratories|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 [[Klasse (objektorientierte Programmierung)|Klassenkonzept]] zu erweitern, für das die Sprache ''Simula-67'' das primäre Vorbild war.
Typische Anwendungsfelder in der Systemprogrammierung sind [[Betriebssystem]]e, [[Eingebettetes System|eingebettete Systeme]], [[virtuelle Maschine]]n, [[Gerätetreiber|Treiber]] und [[Digitaler Signalprozessor|Signalprozessoren]]. C++ nimmt hier oft den Platz ein, der früher ausschließlich [[Assemblersprache]]n und der Programmiersprache [[C (Programmiersprache)|C]] vorbehalten war.


=== Anwendungsprogrammierung ===
Die Wahl fiel auf die Programmiersprache [[C (Programmiersprache)|C]], weil C eine Vielzwecksprache war, schnellen Code produzierte und einfach auf andere Plattformen zu [[Portierung|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.
Bei der Anwendungsprogrammierung kommt C++ vor allem dort zum Einsatz, wo hohe Anforderungen an die Effizienz gestellt werden, um durch technische Rahmenbedingungen vorgegebene Leistungsgrenzen möglichst gut auszunutzen. Ab dem Jahr 2000 wurde C++ aus der Domäne der Anwendungsprogrammierung von den Sprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] zurückgedrängt.


== Eigenschaften ==
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]].
=== Sprachdesign ===
Die Sprache C++ verwendet nur etwa 60 Schlüsselwörter („Sprachkern“), manche werden in verschiedenen Kontexten (<code>static</code>, <code>default</code>) mehrfach verwendet. Ihre eigentliche Funktionalität erhält sie, ähnlich wie auch die Sprache C, durch die [[C++-Standardbibliothek]], die der Sprache fehlende wichtige Funktionalitäten beibringt (Arrays, Vektoren, Listen, …) wie auch die Verbindung zum Betriebssystem herstellt (iostream, fopen, exit, …). Je nach Einsatzgebiet kommen weitere Bibliotheken und Frameworks dazu. C++ legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken. Dadurch favorisiert es verallgemeinerte Mechanismen für typische Problemstellungen und besitzt kaum in die Sprache integrierte Einzellösungen.


Eine der Stärken von C++ ist die Kombinierbarkeit von effizienter, maschinennaher Programmierung mit mächtigen Sprachmitteln, die einfache bis komplexe Implementierungsdetails zusammenfassen und weitgehend hinter abstrakten Befehlsfolgen verbergen. Dabei kommt vor allem die [[C++-Metaprogrammierung|Template-Metaprogrammierung]] zum Zuge: Eine Technik, die eine nahezu kompromisslose Verbindung von Effizienz und Abstraktion erlaubt.
[[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 (<tt>//</tt>).


Einige Design-Entscheidungen werden allerdings auch häufig kritisiert:
[[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 [[objektorientierte Programmierung|Mehrfachvererbung]], abstrakte Klassen, statische Elementfunktionen, konstante Elementfunktionen und die Erweiterung des Schutzmodells um <tt>protected</tt>. [[1990]] erschien das Buch ''The Annotated C++ Reference Manual'', das als Grundlage für den darauffolgenden Standardisierungsprozess diente.


==== Ressourcenverwaltung ====
Relativ spät wurden der Sprache ''Templates'', ''Ausnahmen'', ''Namensräume'', neuartige ''Typumwandlungen'' und ''boolesche Typen'' hinzugefügt.
C++ hat keine [[Garbage Collection]]. Bis Version 20 gab es minimale Funktionalitäten für eine Garbage-Collection. Es gibt Bestrebungen, eine funktionale Garbage-Collection durch Bibliotheken oder durch Aufnahme in den Sprachstandard zu ermöglichen.<ref name="GarbageCollection">{{Internetquelle |autor=Bjarne Stroustrup |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/1996/N0932.pdf |titel=Proposal to Acknowledge that Garbage Collection for C++ is Possible |datum=1996 |format=PDF |sprache=en |abruf=2015-06-06 |zitat=The most loudly proclaimed fundamental weakness of C++ these days is the absence of automatic garbage collection. This criticism is harming C++’s reputation, scaring potential users away, and restricting the range of applications for which C++ is a strong contender as an implementation language. For many applications automatic garbage collection is indeed a very powerful tool and the right tool for the job.}}</ref><ref>{{Internetquelle |autor=Hans-J. Boehm, Mike Spertus, Clark Nelson |url=http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2670.htm |titel=N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised) |werk=open-std.org |datum=2008-06-13 |sprache=en |abruf=2018-01-21}}</ref><ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2310.pdf Transparent Programmer-Directed Garbage Collection for C++] (PDF; 156&nbsp;kB).</ref> Siehe auch [[Boehm-Speicherbereinigung]]. Mit Version 23 wurde die im Code implementierte Garbage Collection vollständig entfernt.<ref>{{Internetquelle |url=https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p2186r2.html#informative |titel=P2186R2: Removing Garbage Collection Support |abruf=2025-02-09}}</ref><ref>{{Internetquelle |url=https://en.cppreference.com/w/cpp/23 |titel=C++23 - cppreference.com |abruf=2025-02-09}}</ref>


Es ist möglich, die Speicherverwaltung von C (malloc/realloc/free) zu verwenden; zur Implementierung von Low-Level-Funktionen in Bibliotheken wie der C++-[[Standardbibliothek]] ist dies zum Zugriff auf C Bibliotheksfunktionen notwendig. In allgemeinem C++-Code wird hiervon jedoch dringend abgeraten.<ref>Bjarne Stroustrup: [http://www.stroustrup.com/bs_faq2.html#memory-leaks C++-FAQ über Speicherlecks] (englisch); abgerufen am 3. Mai 2013.</ref>
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 <tt>printf</tt> und <tt>scanf</tt> bietet. Eine der wesentlichen Erweiterungen der Standardbibliothek kam später durch die Integration großer Teile der bei [[Hewlett-Packard|HP]] entwickelten [[Standard Template Library]] (''STL'') hinzu.
Stattdessen ist es dort üblich, die Speicherverwaltung von der [[C++-Standardbibliothek]] übernehmen zu lassen, indem man die angebotenen Containerklassen verwendet.


Andere Ressourcen, z.&nbsp;B. [[Handle|Dateihandles]] oder [[Socket (Software)|Netzwerksockets]] werden in C++ üblicherweise in eigenen Klassen mit dem Prinzip [[RAII]] verwaltet, um das automatische Aufräumen nach der Verwendung sicherzustellen.
Nach jahrelanger Arbeit wurde schließlich [[1998]] von der [[International Organization for Standardization|ISO]] die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt.
Dies ist konzeptionell in anderen Programmiersprachen oft mit der Implementierung spezieller Basisklassen/Schnittstellen gestaltet – wie z.&nbsp;B. „AutoCloseable“ in Java oder „IDisposable“ in C#.
In anderen Programmiersprachen benötigen diese nicht verwalteten Ressourcen oft ein spezielles Handling (z.&nbsp;B. „using“-Schlüsselwort in C#), um die Lebenszeit dieser Objekte ausnahmesicher in Verbindung mit dem Garbage Collector zu verwalten.
Die RAII-basierten Implementierungen in C++ sind konzeptbedingt nicht anfällig bezüglich dieser Probleme, da Speicher in C++ keinen Sonderstatus als Ressource hat. Eine korrekte Implementierung der Objektlebenszeit garantiert hier die Freigabe aller Ressourcen.


Für Verweise auf Objekte werden üblicherweise Referenzen verwendet, solange der Verweis das Objekt nicht besitzen soll – z.&nbsp;B. als Parameter bei Funktionsaufrufen.
[[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|in der Entwicklung befindliche Version]]'')
Um den Besitz von dynamisch allokierten Objekten zu verwalten, werden üblicherweise [[Smart Pointer]] eingesetzt, welche die Destruktion und Speicherfreigabe übernehmen.
Die Standardbibliothek unterscheidet hier strikt den Besitz. Während beim ''unique_ptr'' nur dieser Zeiger den Speicher besitzt, kann der Besitz des Speichers beim ''shared_ptr'' zwischen mehreren Zeigerinstanzen geteilt werden.
Technisch realisiert ist dies beim ''shared_ptr'' meist mit [[Reference counting]].<ref>[https://de.cppreference.com/w/cpp/memory/shared_ptr std::shared_ptr auf cppreference.com], Abschnitt Hinweise zur Umsetzung; abgerufen am 5. Juni 2020</ref>


==== Unvollständige Objektorientierung ====
== Merkmale ==
===== Sichtbarkeit privater Elemente =====
In C++ gehören private Eigenschaften (Variablen und Methoden) normalerweise mit zur Schnittstelle, die in der Header-Datei veröffentlicht ist. Dadurch entstehen zur [[Compilezeit]] und zur [[Laufzeit (Informatik)|Laufzeit]] Abhängigkeiten der Objekte zu den Stellen, die sie verwenden.


Diese Abhängigkeiten können durch bestimmte Konstruktionen, wie dem ''pimpl-Idiom'' (''{{lang|en|pointer to implementation idiom}}''), vermieden werden. Dabei werden die privaten Felder der Klasse (''example_class'') in eine private, vorwärts-deklarierte Hilfsklasse verschoben, und ein Zeiger auf ein Objekt dieser Hilfsklasse (''example_class::impl * impl_ptr'') bleibt in der eigentlichen Klasse. Die Definition der implementierenden Klasse findet bei der Implementierung der öffentlichen Klasse statt und ist damit für den Verwender der Klasse (der nur die Header-Datei kennt) unsichtbar. Dadurch, dass die Hilfsklasse nur durch einen Zeiger referenziert wird, bleiben alle Quelltextänderungen an privaten Feldern transparent und die [[Binärkompatibilität]] wird erhalten.<ref>[https://www.heise.de/developer/artikel/C-Vor-und-Nachteile-des-d-Zeiger-Idioms-Teil-1-1097781.html ''Das d-Zeiger-Idiom.''] auf heise Developer.</ref>
C++ unterstützt die folgenden Programmiertechniken:


===== Unvollständige Kapselung =====
* [[Prozedurale Programmierung]]
In C++ sind die Speicherbereiche der einzelnen Objekte zur Laufzeit nicht vor (absichtlichen oder versehentlichen) gegenseitigen Änderungen geschützt.
* [[Modulare Programmierung]]
* [[Strukturierte Programmierung]]
* [[Datentyp|Programmierung mit selbstdefinierten Datentypen]] ([[Abstrakter Datentyp|abstrakte Datentypen]])
* [[Objektorientierte Programmierung]] (siehe auch [[Polymorphie (Programmierung)|Polymorphie (Vielgestaltigkeit)]])
* [[Generische Programmierung]] mittels [[Template (Programmierung)|Templates]].


==== Undefiniertes Verhalten ====
C++ ist somit eine so genannte "Multiparadigmen-Sprache", die dem Programmierer sehr viele Freiheiten lässt. (Siehe Stärken und Schwächen)
Das Verhalten von einigen Sprachkonstrukten ist nicht definiert. Dies bedeutet, dass der Standard weder vorgibt noch empfiehlt, was in einem solchen Fall passiert. Die Auswirkungen reichen von Implementierungsabhängigkeit (d.&nbsp;h. je nach Zielrechner und Compiler kann sich das Konstrukt unterschiedlich verhalten) über unsinnige Ergebnisse oder Programmabstürze bis hin zu Sicherheitslücken. Einige dieser Freiheiten des [[Compiler]]s lassen zusätzliche Optimierungen des Codes zu.


Es kommt zu unterschiedlichem Verhalten bei
''Siehe auch:'' [[Programmierparadigma]], [[Entwurfsmuster]], [[Ressourcenbelegung ist Initialisierung|RAII]]
* verschiedenen Compilern
* verschiedenen Compiler-Versionen
* verschiedener Architektur ([[Arm-Architektur|ARM]], [[X86-Prozessor|x86]], [[x64]])
* verschiedenen Optimierungseinstellungen (Debug, Release, Optimierung)
* ausgewählter [[Befehlssatz]], Aufrufkonventionen, u.&nbsp;v.&nbsp;a.&nbsp;m.
Quellcode mit Codepassagen mit undefiniertem Verhalten kann nach der Kompilierung unerwartetes und absurd erscheinenden Verhalten zeigen. So werden zu spät durchgeführte Überprüfungen wegoptimiert oder Schleifen, die auf einen ungültigen Index eines Arrays zugreifen, durch leere Endlosschleifen ersetzt.<ref>{{Webarchiv |url=http://www.indiedev.de/wiki/Undefiniertes_Verhalten_bei_mehrfacher_Zuweisung |text=''Undefiniertes Verhalten bei mehrfacher Zuweisung.'' |wayback=20140822010845}}, abgerufen am 20. August 2014.</ref><ref>Scott Meyers: ''Effektiv C++ Programmieren.'' Addison-Wesley, S. 22/23, 43/44 und 46, nach [http://books.google.de/books?id=8E5P-Sa0SCcC&pg=PA23&lpg=PA23&dq=c%2B%2B+undefiniertes+verhalten&source=bl&ots=DjZMctDkCj&sig=7-bBrXKpWZB2rciz0hSRYGrqVO0&hl=de&sa=X&ei=uHn0U8LfJoKJ4gSK3IHQBg&ved=0CF0Q6AEwCA#v=onepage&q=c%2B%2B%20undefiniertes%20verhalten&f=false Google-Books], abgerufen am 20. August 2014.</ref>


Wichtig für das Verständnis von undefiniertem Verhalten ist insbesondere, dass niemals nur eine einzelne Operation ungültig ist, sondern das ''gesamte Programm'' ungültig wird und kein wohlgeformtes C++ mehr darstellt. Der Grund ist, dass manche Arten von „undefiniertem Verhalten“ Auswirkungen auf ganz andere, auch in sich korrekte, Programmteile haben und deren Verhalten beeinflussen können, beispielsweise bei Pufferüberläufen oder der unbeabsichtigten Änderung von Prozessor-Flags, die durch eine ungültige arithmetische Operation verursacht wurde und die nachfolgenden Berechnungen beeinflussen kann.
== Allgemeine Bewertung ==


Beispiele für ''undefiniertes Verhalten'':
===Stärken===
* Überlauf von vorzeichenbehafteten Ganzzahlen (auch z.&nbsp;B. bei Umwandlung von <code>unsigned int</code> nach <code>int</code>)
* Die Erzeugung hocheffizienten Codes ist möglich.
* [[Nullzeiger]]-Dereferenzierungen
* Sowohl maschinennahe als auch hochabstrakte Programmierung ist möglich.
* Arrayzugriffe mit ungültigem Index
* Sehr hohe Ausdrucksstärke und Flexibilität - Beispiel: die anpassbare Freispeicherverwaltung, in die sich etwa nahtlos ein [[Garbage Collector]] integrieren ließe
* [[Bitweiser Operator#Bitweise Verschiebungen|Schiebeoperationen]] mit einer Schiebeweite, die negativ oder größergleich der Zahl der Bits des zu schiebenden Typs ist
* Für große Projekte geeignet
* Division durch null mit integralen Datentypen
* Weite Verbreitung
* Weglassen des <code>return</code>-Statements in Funktionen mit Rückgabewert (die Hauptfunktion <code>main</code> bildet die einzige Ausnahme)
* Die Sprache ist nicht im Besitz einer Organisation (im Unterschied zu beispielsweise [[Java (Programmiersprache)|Java]]). Standardisierung durch die [[International Organization for Standardization|ISO]]
* Ein Nebeneffekt ändert eine Variable, die mehrmals in dem Ausdruck (<code>v[i] = i++;</code>) oder in der [[Parameter (Informatik)|Argumentliste]] (<code>f(i, i++);</code>) vorkommt (die Auswertungsreihenfolge von Teilausdrücken und Funktionsargumenten ist nicht festgelegt)
* Weitreichende Möglichkeiten für die [[C-Plusplus-Metaprogrammierung|Metaprogrammierung]]
* Kompatibilität mit C - Vorteil: Es steht eine breite Codebasis zur Verfügung.


Einerseits ist das hieraus resultierende nichtdeterministische Laufzeitverhalten, insbesondere bei kleinen Änderungen der Plattform, mindestens als Risiko, in der Praxis oft aber als klarer Nachteil einzustufen. Andererseits werden hierdurch schnellere Programme ermöglicht, da Gültigkeitsüberprüfungen weggelassen werden können und der Compiler zudem oft Programmteile stärker optimieren kann, indem er Randfälle als per Definition ausgeschlossen ignoriert.
===Schwächen===
* Kompatibilität mit C - Nachteil: historischer Ballast muss mitgeschleppt werden, zum Beispiel der von C übernommene Präprozessor, die teilweise unnötig schwer verständliche C-Syntax.
* 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 vorhandene C++-Standardbibliothek deckt viele wichtige Erfordernisse nicht ab, zum Beispiel [[Thread]]s, [[TCP/IP]], Dateisystem-Verzeichnisse. Deshalb besteht in diesen Bereichen eine eingeschränkte Portabilität über Betriebssystemgrenzen hinweg. Dies führte auch zur Entwicklung zahlreicher Frameworks, die ein teilweise unausgereiftes und uneinheitliches Bild von C++ vermitteln.


Ein oft nicht wahrgenommener Vorteil ist darüber hinaus, dass dadurch, dass undefiniertes Verhalten praktisch nur in äußerst fragwürdigen Konstrukten auftritt, die aber nicht zwingend während des Kompilierens feststellbar sind, unsemantischer oder anderweitig suboptimaler Code gewissermaßen verboten wird.
== [[Hallo-Welt-Programm]] in C++ ==


Beispielsweise besteht eine illegale Art zu prüfen, ob die Summe zweier positiver Ganzzahlen <math>a</math> und <math>b</math> vom Typ ‚int‘ verlustfrei wieder in einem ‚int‘ abgebildet werden kann, daraus, zu schauen, ob ihre Summe größer 0 ist (bei Überlauf entsteht auf den meisten Computern durch die [[Zweierkomplement]]-Arithmetik eine negative Zahl). Eine derartige Überprüfung ist allerdings aus mathematischer Sicht nicht besonders sinnvoll. Eine bessere (semantischere) Herangehensweise ist hier, die eigentliche Frage, ob <math>a + b \le \mathrm{INT\_MAX}</math>, wobei <math>\mathrm{INT\_MAX}</math> die größte in einem ‚int‘ darstellbare Zahl ist, nach der mathematisch validen Umformung zu <math>a \le \mathrm{INT\_MAX} - b</math> zu verwenden.<ref>[http://florianjw.de/en/modern_cpp.html#undefined_behavior ''Myths and Missconceptions about C++, Abschnitt Undefined Behavior''], abgerufen am 20. Februar 2015 (englisch).</ref>
Der folgende [[Quelltext]] stellt ein einfaches C++-[[Computerprogramm|Programm]] dar, das eine Meldung auf dem Standardausgabemedium ausgibt:


=== Kompatibilität mit C ===
<!-- WICHTIGER HINWEIS: Änderungen am Hallo-Welt-Programm erst auf der Diskussionsseite besprechen! -->
Um an die Verbreitung der Programmiersprache C anzuknüpfen, wurde C++ als Erweiterung von [[C (Programmiersprache)|C]] gemäß dem damaligen Stand von 1990 ([[ISO/IEC 9899:1990]], auch kurz C90 genannt) entworfen.
#include <iostream>
&nbsp;
int main()
{
std::cout << "Hallo Welt!" << std::endl;
<!-- Der Rückgabewert ist (im Unterschied zu C89) implizit vorhanden, fehlt also nicht!-->
}


Die Kompatibilität mit C zwingt C++ zur Fortführung einiger dadurch übernommener Nachteile. Dazu zählt die teilweise schwer verständliche C-Syntax, der als überholt geltende [[C-Präprozessor|Präprozessor]] sowie verschiedene von der jeweiligen Plattform abhängige Details der Sprache<!--, wie beispielsweise die Auswertungsreihenfolge von Teilausdrücken-->, die die Portierung von C++-Programmen zwischen unterschiedlichen Rechnertypen, Betriebssystemen und Compilern erschweren.
'''Erläuterungen:'''


Einige C-Sprachkonstrukte haben in C++ eine leicht abgewandelte Bedeutung oder Syntax, so dass manche C-Programme erst angepasst werden müssen, um sich als C++-Programm übersetzen zu lassen. Weitere Änderungen an C fanden in den Jahren 1999 ([[ISO/IEC 9899:1999]], aka C99) und 2011 ([[ISO/IEC 9899:2011]], aka C11) also nach der ersten Normung von C++ statt, so dass dort eingeflossene Änderungen nicht in C++98 berücksichtigt werden konnten. In die C++-Revision von 2011 wurde ein Teil der Neuerungen von C99 übernommen; auf der anderen Seite wurden dem C-Standard neue Features hinzugefügt, die auch mit C++11 nicht kompatibel sind.
Bei <tt>main</tt> handelt es sich um eine [[Funktion (Programmierung)|Funktion]], genauer gesagt ist es die Hauptfunktion des gesamten Programmes. Die Funktion <tt>main</tt> ist in jedem C++-Programm vorhanden und wird nach dem Start des Programmes aufgerufen.


=== Sprachmerkmale im Detail ===
Die C++-ISO-Norm schreibt vor, dass das Ergebnis von <tt>main</tt> vom Typ <tt>int</tt> sein muss. Ein Programm, bei dem das Ergebnis von <tt>main</tt> nicht vom Typ <tt>int</tt> ist, ist kein gültiges Programm im Sinne der C++-ISO-Norm (ISO-14882).
C++ basiert auf der Programmiersprache [[C (Programmiersprache)|C]], wie in [[Internationale Organisation für Normung|ISO]]/IEC 9899:1990 beschrieben. Zusätzlich zu den in C vorhandenen Möglichkeiten bietet C++ weitere [[Datentyp]]en sowie neuartige Typumwandlungsmöglichkeiten, [[Klasse (Objektorientierung)|Klassen]] mit [[Mehrfachvererbung]] und [[Virtuelle Funktion|virtuellen Funktionen]], [[Ausnahmebehandlung]], [[Template (C++)|Templates]] (Schablonen), [[Namensraum|Namensräume]], [[Inline-Ersetzung|Inline-Funktionen]], [[Überladen]] von [[Operator (Mathematik)|Operatoren]] und Funktionsnamen, [[Referenz (Programmierung)|Referenzen]], Operatoren zur Verwaltung des [[Dynamischer Speicher|dynamischen Speichers]] und mit der [[C++-Standardbibliothek]] eine erweiterte [[Programmbibliothek|Bibliothek]].
<!-- C++ wurde als Mehrzwecksprache konzipiert und unterstützt unter anderem [[abstrakter Datentyp|Datenabstraktion]], [[prozedurale Programmierung|prozedurale]], [[objektorientierte Programmierung|objektorientierte]] und [[generische Programmierung|generische]] Programmierung.<ref name="HOPL">{{Internetquelle |url=http://www.research.att.com/~bs/hopl-almost-final.pdf |titel=research.att.com}}</ref>


C++ ist eine sogenannte „Multiparadigmen-Sprache“, die verschiedene Programmiertechniken unterstützt:
Die Funktion <tt>main</tt> ist die einzige Funktion, die &ndash; obwohl sie einen Wert zurückgibt &ndash; nicht die Anweisung "<tt>return</tt>" benötigt. Ohne die explizite Anweisung <tt>return</tt> gibt <tt>main</tt> den Wert 0 zurück.
* [[prozedurale Programmierung]]
* [[modulare Programmierung]]
* [[strukturierte Programmierung]]
* Programmierung mit selbstdefinierten [[Datentyp]]en ([[Abstrakter Datentyp|abstrakte Datentypen]])
* [[objektorientierte Programmierung]] (siehe auch [[Polymorphie (Programmierung)|Polymorphie (Vielgestaltigkeit)]])
* [[generische Programmierung]] mittels [[Template (C++)|Templates]].


{{Siehe auch|Programmierparadigma|C++-Metaprogrammierung}} -->
== Verwandtschaft mit C ==


=== Programmbeispiel ===
C++ ist eine Erweiterung der Programmiersprache [[C (Programmiersprache)|C]] gemäß dem Stand von 1990 (''ISO/IEC 9899:1990'', auch kurz [[ISO/IEC_9899:1990|C90]] genannt). C++ enthält C nach dem Stand ''C90'' fast vollständig. Einige wenige C-Programme lassen sich zwar 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.
Der folgende [[Quelltext]] ist ein einfaches C++-[[Computerprogramm|Programm]], das den Text [[Hallo-Welt-Programm|„Hallo Welt!“]] in den [[Standard-Datenströme|Standardausgabestrom]], üblicherweise das [[Kommandozeile|Terminal]], schreibt:


<syntaxhighlight lang="cpp">
Die Kompatibilität mit C war eines der Hauptdesignziele bei der Entwicklung der Programmiersprache C++. Grund dafür war die weite Verbreitung von C. Da C auch heute noch für praktisch jeden Prozessor verfügbar ist, und daher C die verbreitetste Programmiersprache darstellt, wird Kompatibilität mit C immer noch als eine der wichtigsten Eigenschaften von C++ angesehen.
#include <iostream>


int main() {
Im Laufe der Entwicklung der beiden Sprachen gab es auch Rückwirkungen von C++ auf C. Beispielsweise wurden in C <tt>const</tt> sowie die [[Funktionsprototyp]]en von C++ übernommen.
std::cout << "Hallo Welt!" << std::endl;
return 0;
}
</syntaxhighlight>


Der [[C-Präprozessor|Präprozessorbefehl]] oder auch Präprozessordirektive genannt <code>#include</code> bindet [[Header-Datei]]en ein, die typischerweise Deklarationen von Variablen, Typen und Funktionen enthalten. Im Gegensatz zu C besitzen Header der C++-Standardbibliothek keine Dateiendung.
Die letzten Änderungen an C fanden [[1999]] statt (ISO/IEC 9899:1999). Gemäß dem [[Ratifizierung]]sjahr ''1999'' spricht man, wenn man sich auf diesen C-Stand bezieht, deshalb auch von [[ISO/IEC_9899:1999|C99]]. Ein Beispiel für darin eingeführte Spracherweiterungen sind die so genannten [[Variable_Length_Array|VLA]]s (engl. ''variable length array'').


Der Header <code><iostream></code> ist Teil der C++-Standardbibliothek und deklariert unter anderem den Standardeingabestrom <code>std::cin</code> und die Standardausgabeströme <code>std::cout</code> und <code>std::cerr</code> für die aus der C-Standardbibliothek bekannten Objekte <code>stdin</code>, <code>stdout</code> und <code>stderr</code>.
Aufgrund dieser Weiterentwicklung von C gibt es theoretisch mehr Inkompatibilitäten zwischen C und C++. Da es aber nicht viele C-Compiler gibt, die C99 unterstützen, hat dies keine große praktische Bedeutung. Bei der in Arbeit befindlichen C++-Version wird u.a. daran gearbeitet, die neuen C99-Merkmale miteinzuarbeiten. Einige C++-Compiler unterstützen C99-Neuerungen schon jetzt (z.B. der [[GNU Compiler Collection|gcc]]).

Bei <code>main()</code> handelt es sich um die [[Funktion (Programmierung)|Funktion]], die den [[Einsprungpunkt]] jedes C++-Programms darstellt. Das Programm wird ausgeführt, indem die Funktion <code>main()</code> aufgerufen wird, wobei diese ihrerseits andere Funktionen aufrufen kann. Die Funktion <code>main()</code> selbst darf allerdings in einem C++-Programm nicht [[Rekursive Programmierung|rekursiv]] aufgerufen werden.

Der Standard verlangt von Implementierungen, zwei [[Signatur (Programmierung)|Signaturen]] für die Funktion <code>main()</code> zu unterstützen: Eine ohne Funktionsparameter wie im Beispiel, und eine, die einen Integer und einen Zeiger auf Zeiger auf <code>char</code> entgegennimmt, um auf [[Kommandozeilenparameter]] zugreifen zu können (was nicht in allen Programmen vonnöten ist): <code>int main(int argc, char **argv)</code>. Implementierungen dürfen darüber hinaus weitere Signaturen für <code>main()</code> unterstützen, alle müssen jedoch den Rückgabetyp <code>int</code> ([[Integer (Datentyp)|Integer]]) besitzen, also eine Ganzzahl zurückgeben. Würde <code>main()</code> keinen Wert zurückgeben, schreibt der C++-Standard der Implementierung vor, <code>return 0;</code> anzunehmen. <code>main()</code> gibt also 0 zurück, wenn kein anderslautendes <code>return</code>-Statement in ihr vorhanden ist.<ref>{{Internetquelle |url=http://www.stroustrup.com/bs_faq2.html#void-main |titel=Bjarne Stroustrup's C++ Style and Technique FAQ |werk=www.stroustrup.com |datum=2017-09-30 |sprache=en |abruf=2018-09-22}}</ref>

<code>std::cout</code> ist eine [[Objektorientierte Programmierung#Klassen|Instanz der Klasse]] <code>std::basic_ostream<char></code>, die sich wie die gesamte C++-Standardbibliothek im [[Namensraum]] <code>std</code> befindet. Bezeichner in Namensräumen werden mit dem Bereichsoperator (<code>::</code>) angesprochen.

Die Ausgabe des [[Konstante (Programmierung)|Zeichenkettenliterals]] <code>"Hallo Welt"</code> übernimmt der Operator <code><<</code>. Zeichenkettenliterale sind in C++ vom Typ ''Array aus N konstanten chars'' (<code>char const[N]</code>), wobei ''N'' gleich der Länge der Zeichenkette + 1 für die abschließende [[Zeichenkette#Repräsentation mit Abschlusszeichen|Nullterminierung]] ist. Da die [[Typumwandlung|Standardtypumwandlungen]] von C++ die als ''pointer-to-array decay'' bekannte implizite Umwandlung eines Arrays <code>T[N]</code> in einen Pointer <code>T*</code> vorsehen, und damit <code>char const[N]</code> in einen <code>char const*</code> zerfällt, passt der [[Überladen|überladene Operator]] <code>template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *);</code> aus <code><ostream></code> und wird entsprechend aufgerufen (<code>operator<<( std::cout, "Hallo Welt!" );</code>) und gibt die Zeichenkette aus. Durch den Ausgabemanipulator <code>std::endl</code> wird ein [[Carriage return|Zeilenendezeichen]] ausgegeben.

Bei <code>return 0</code> wird dem aufrufenden Programm über das Betriebssystem mitgeteilt, dass die Ausführung des Programms erfolgreich war.

=== Dateiendungen ===
Typische Dateiendungen sind .C, .cc, .cpp, .cxx, {{nowrap|.c++}}, .h, .hh, .hpp, .hxx, {{nowrap|.h++}}, .ipp, .tpp, .ixx.

== Umsetzung ==
=== C++-Compiler ===
Die Implementierung eines C++-[[Compiler]]s gilt als aufwendig. Nach der Fertigstellung der Sprachnorm 1998 dauerte es mehrere Jahre, bis die Sprache von C++-Compilern weitestgehend unterstützt wurde.

Zu den verbreitetsten C++-Compilern gehören:
; Visual C++: Der in Microsoft [[Visual C++]] enthaltene Compiler ist der am weitesten verbreitete für das Betriebssystem [[Microsoft Windows|Windows]]. Die Community-Edition stellt Microsoft kostenlos zur Verfügung.

; GCC: Der g++ ist die C++-Ausprägung der ''[[GNU Compiler Collection]]'' (GCC); g++ ist quelloffen und frei verfügbar. Der g++ unterstützt eine Vielzahl von Betriebssystemen (darunter [[Unix]], [[Linux]], [[macOS]], [[Microsoft Windows|Windows]] und [[AmigaOS]]) und Prozessorplattformen. ''GNU C++'' existiert seit 1987 und ist somit einer der ältesten C++-Compiler.<ref name="hopIII">Bjarne Stroustrup: [http://www.stroustrup.com/hopl-almost-final.pdf ''Evolving a language in and for the real world: C++ 1991–2006.''] (PDF; 690&nbsp;kB).</ref>

; Clang: [[Clang]], ein C++ Compiler-Frontend für plattformübergreifende Compilerinfrastruktur [[LLVM]], die unter anderem auch in der Apple eigenen integrierten Entwicklungsumgebung [[Xcode]] verwendet wird.<ref>{{Internetquelle |url=http://clang.llvm.org/ |titel=Clang: a C language family frontend for LLVM |werk=clang.llvm.org |sprache=en |abruf=2018-09-22}}</ref> Im Clang/LLVM Ecosystem sind auch mehrere Tools zur statischen Codeanalyse entstanden wie z.&nbsp;B. „clang-tidy“ und „clang-format“.

; Intel C++ Compiler: Der [[Intel C++ Compiler]] verwendet ebenfalls das unten erwähnte C++-Front-End von EDG. Der ''Intel C++ Compiler'' erzeugt [[Maschinencode]] für die [[Intel]]-Prozessoren unter den Betriebssystemen Windows, Linux und macOS. Da die mit dem ''Intel C++ Compiler'' erzeugten Programme den Befehlssatz der Intel-Prozessoren besonders gut ausnutzen, erzeugen sie besonders effiziente Programme für diese Plattform. (Kompilate des Intel-Compilers laufen ebenfalls auf [[AMD#Mikroprozessoren|AMD-Chips]] meist schneller als Kompilate der alternativen Compiler, entsprechende Optimierungsflags sperrt Intel jedoch, wobei sich die Sperre aufheben lässt.) Der Intel C++ Compiler nutzt im Unterbau wesentliche Teile des g++ und ersetzt und erweitert Teile der Code-Optimierung und Code-Generierung.

; Oracle Solaris Studio: [[Oracle Solaris Studio]] stellt Oracle kostenlos zur Verfügung.<ref>{{Internetquelle |url=http://www.oracle.com/technetwork/server-storage/developerstudio/overview/index.html |titel=Oracle Developer Studio |werk=www.oracle.com |sprache=en |abruf=2018-09-22}}</ref>

; Comeau C++: Der [[Comeau C++]]. Das sogenannte „[[Frontend und Backend|Front-End]]“ des Compilers, also der Teil, der die Analyse-Phase implementiert, wurde von der Firma ''Edison Design Group'' (EDG) entwickelt, die sich auf die Entwicklung von Compiler-Front-Ends spezialisiert hat und deren C++-Front-End auch in vielen anderen kommerziellen C++-Compilern integriert ist. Der Comeau-Compiler kann auch über das Internet ausprobiert werden.

; Turbo&nbsp;C++: Mit [[Turbo C|Turbo&nbsp;C++]]/[[C++Builder|C++&nbsp;Builder]] steht ein weiterer Compiler zur Verfügung.<ref>{{Internetquelle |url=http://www.turboexplorer.com/cpp |titel=Turbo C++ Community |werk=www.turboexplorer.com |sprache=en |abruf=2018-09-22}}</ref>

== Integrierte Entwicklungsumgebungen ==
=== Freie Entwicklungsumgebungen ===
* [[Anjuta (Software)|Anjuta]]
* [[Arduino (Plattform)|Arduino]]
* [[CodeLite]]
* [[Code::Blocks]]
* [[Eclipse (IDE)|Eclipse]]
* [[Geany]]
* [[GNAT Programming Studio]]
* [[GNU Emacs]] (Mit C++ Erweiterungen)
* [[KDevelop]]
* [[MonoDevelop]]
* [[NetBeans IDE]]
* [[Orwell Dev-C++]]
* [[Qt Creator]]
* [[TOPCASED]]
* [[Ultimate++]]
* [[WideStudio]]
* [[Visual Studio Code]] (Mit C++ Erweiterung)

=== Proprietäre Entwicklungsumgebungen ===
* [[C++Builder]]
* CLion (basiert auf [[IntelliJ IDEA]])
* [[CodeWarrior]]
* [[Conzept 16]] (Programmiersprache C++ ähnlich)
* [[Cubic IDE]]
* [[ICon-L|ICON-L]]
* [[Kylix (Entwicklungsumgebung)|Kylix]]
* [[Visual Studio]]
* [[Xcode]]


== Vergleich mit anderen Sprachen ==
== Vergleich mit anderen Sprachen ==
=== Objective-C ===
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++ syntaktisch wie von ihrem Funktionsprinzip an [[Smalltalk (Programmiersprache)|Smalltalk]] und nicht an [[Simula]] orientierte. Die Syntax von Objective-C (C beeinflusst durch Smalltalk) unterscheidet sich erheblich von C++ (C beeinflusst von Simula mit ganz eigenen syntaktischen Erweiterungen). Ende der 1980er Jahre wurde Objective-C erstmals kommerziell in [[OPENSTEP|NeXTStep]] verwendet, in dem es einen zentralen Bestandteil darstellt. Heutzutage findet es in der Programmierschnittstelle [[OpenStep]] (bzw. [[Cocoa (API)|Cocoa]] und [[GNUstep]]) sowie in den Betriebssystemen [[iOS (Betriebssystem)|iOS]] und [[macOS]] ein wichtiges Einsatzgebiet.


=== Java und C# ===
Die Programmiersprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] haben eine ähnliche Syntax wie C++, sind aber "intern" anders aufgebaut. Java und C# sind praktisch nicht mehr kompatibel mit C.
Die Programmiersprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] verfügen über eine ähnliche, ebenfalls an C angelehnte Syntax wie C++,<ref>[https://docs.oracle.com/javase/specs/jvms/se6/html/Introduction.doc.html ''Java – A Bit of History''] oder {{Literatur |Autor=Peter Drayton, Ted Neward, Ben Albahari |Titel=C# in a Nutshell: A Desktop Quick Reference |Auflage=2. |Verlag=O’Reilly |Datum=2003 |ISBN=978-0-596-00526-9}}</ref> sind auch objektorientiert und unterstützen seit einiger Zeit<!-- genauer: seit wann? --> Typparameter<!-- Generik -->. Trotz äußerlicher Ähnlichkeiten unterscheiden sie sich aber konzeptionell von C++ zum Teil beträchtlich.<!-- mehr und genauer! -->


Generische Techniken ergänzen die objektorientierte Programmierung um Typparameter und erhöhen so die Wiederverwertbarkeit einmal kodierter Algorithmen. Die generischen Java-Erweiterungen sind jedoch lediglich auf Klassen, nicht aber auf primitive Typen oder Datenkonstanten anwendbar. Demgegenüber beziehen die generischen Spracherweiterungen von C# auch die primitiven Typen mit ein. Dabei handelt es sich allerdings um eine Erweiterung für Generik zur Laufzeit, die die auf Kompilationszeit zugeschnittenen C++-Templates zwar sinnvoll ergänzen, nicht aber ersetzen können.
Ein wesentlicher Unterschied zwischen diesen Sprachen und C++ besteht darin, dass C++ über generische Sprachmerkmale ([[Template (Programmierung)|Templates]]) verfügt. Es gibt zwar in Java eine generischen Spracherweiterung und bei C# wird an ebensolcher (s. [[generischer Typ]]) gearbeitet (Stand: 2004), die Entwicklung geht dort aber in eine etwas andere Richtung als bei C++.


Gerade die generische Programmierung macht aber C++ zu einem mächtigen Programmierwerkzeug. Während die objektorientierte Programmierung in Java und C# als der Gipfel der vorhandenen Abstraktionsmechanismen angesehen wird, ist diese Art der Programmierung in C++ rückläufig. So werden tiefe Klassenhierarchieen vermieden, und zu Gunsten der Effizienz und der Minimierung des Ressourcenverbrauchs verzichtet man in vielen Fällen auf [[Polymorphie (Programmierung)|Polymorphie]], dem Kernmechanismus der objektorientierten Programmierung. Auch in Punkto Wiederverwertbarkeit einmal kodierter Algorithmen übertreffen generische Techniken nach Meinung vieler Fachleute die objektorientierte Programmierung.
Gerade die generische Programmierung macht C++ zu einem mächtigen [[Programmierwerkzeug]]. Während die objektorientierte Programmierung in Java und C# nach wie vor den zentralen Abstraktionsmechanismus darstellt, ist diese Art der Programmierung in C++ rückläufig. So werden tiefe Klassenhierarchien vermieden, und zu Gunsten der Effizienz und der Minimierung des Ressourcenverbrauchs verzichtet man in vielen Fällen auf [[Polymorphie (Programmierung)|Polymorphie]], einen der fundamentalen Bestandteile der objektorientierten Programmierung.


''Siehe auch:'' [[Simula]], [[Objective-C]], [[Smalltalk]], [[Eiffel (Programmiersprache)]]
{{Siehe auch|Simula|Smalltalk (Programmiersprache)|titel2=Smalltalk}}


== Entstehung und Weiterentwicklung ==
== In der Entwicklung befindliche Version ==
=== Entstehungsgeschichte ===
'''C++0x''' (manchmal auch '''C++200x''') ist eine inoffizielle Abkürzung für die in der Entwicklung befindliche Version der Programmiersprache C++.
Auf die Idee für eine neue Programmiersprache kam Stroustrup durch Erfahrungen mit der Programmiersprache [[Simula]] während seiner Doktorarbeit an der ''Cambridge University''. Simula erschien zwar geeignet für den Einsatz in großen Software-Projekten, die Struktur der Sprache erschwerte aber die Erstellung [[Effizienz (Informatik)|hocheffizienter Programme]]. Demgegenüber ließen sich effiziente Programme zwar mit der Sprache [[BCPL]] schreiben, für große Projekte war BCPL aber wiederum ungeeignet.


Mit den Erfahrungen aus seiner Doktorarbeit erweiterte Stroustrup in den AT&T [[Bell Laboratories]] im Rahmen von Untersuchungen des [[Unix]]-Betriebssystemkerns in Bezug auf [[verteiltes Rechnen]] ab 1979 die [[C (Programmiersprache)|Programmiersprache C]]. Die Wahl fiel auf die Programmiersprache C, da C eine Mehrzwecksprache war, die schnellen Code produzierte und einfach auf andere Plattformen zu [[Plattformunabhängigkeit|portieren]] war. Als dem Betriebssystem Unix beiliegende Sprache hatte C außerdem eine erhebliche Verbreitung.
Zwar scheint der Name anzudeuten, dass dieser Standard bis spätestens 2009 fertig gestellt wird, dies ist jedoch nicht der Fall. Es handelt sich lediglich um eine grobe Einschätzung des möglichen Erscheinungstermins.


Eine der ersten Erweiterungen war ein [[Klasse (Objektorientierung)|Klassenkonzept]] mit Datenkapselung, für das die Sprache ''Simula-67'' das primäre Vorbild war. Danach kamen abgeleitete Klassen hinzu, ein strengeres [[Typsystem]], Inline-Funktionen und Standard-Argumente.
== C++-Compiler ==


Während Stroustrup ''C with Classes'' („C mit Klassen“) entwickelte (woraus später C++ wurde), schrieb er auch ''cfront'', einen Compiler, der aus ''C with Classes'' zunächst C-Code als Zwischenresultat erzeugte. Die erste kommerzielle Version von ''cfront'' erschien im Oktober 1985.
{| cellspacing="0" cellpadding="4" rules="all" style="margin-right:auto;border-collapse:collapse;"
! Compiler
! Kommentar
! Plattform
|-----
|style="white-space:nowrap;"| ''[http://www.comeaucomputing.com/ Comeau's C++ Compiler]''
| Gilt als der Compiler, der C++ vollständig umsetzt; unterstützt zum Beispiel auch <tt>export</tt> von Templates; Kommandozeilencompiler; kann [http://www.comeaucomputing.com/tryitout/ über das Internet] ausprobiert werden || verschiedene Plattformen
|-----
|style="white-space:nowrap;"| ''[http://gcc.gnu.org g++]''
| Bestandteil von [[GNU Compiler Collection|GCC]]; Kommandozeilencompiler; kann aber auch in [[integrierte Entwicklungsumgebung|integrierten Entwicklungsumgebungen]] ausgeführt werden, zum Beispiel unter Linux in ''[[KDevelop]]'' oder ''[[Anjuta]]''; unter Windows mit ''[[DevCpp|Dev-C++]]'' || Unix, Linux, Mac&nbsp;OS&nbsp;X, Windows (dort auch als [[MinGW]])
|-----
| ''[http://www.borland.com/bcppbuilder/freecompiler/ Borlands Free CommandLine Tools] (bcc55)''
| Mittlerweile zum kostenlosen Download freigegebener Bestandteil von Borlands C++ Compiler. Ohne grafische Benutzeroberfläche ([[integrierte Entwicklungsumgebung|IDE]]), aber voll funktionsfähig und daher vorallem bei Anfängern in C++ beliebt. Inzwischen gibt es sogar Installer ([http://www.lawilog.de/bcc55.html z.B. von Fans]) und [[integrierte Entwicklungsumgebung|IDEs]] ([http://www.objectcentral.com/vide.htm z.B. VIDE]) entwickelt. || Windows
|-----
|style="white-space:nowrap;"| ''[http://www.intel.com/software/products/compilers/ Intel C++]''
| Ebenfalls ein Compiler, der C++ nahezu vollständig umsetzt; erzeugt hocheffizienten Code für Intel-Prozessoren; Kommandozeilencompiler || Windows, Linux
|-----
|style="white-space:nowrap;"| ''[[Microsoft-Visual-C-Plusplus|Microsoft Visual C++]]''
| Verbreitetster Compiler unter Windows; empfohlen ist die Version 7.1 oder neuer, wegen nahezu vollständiger Umsetzung der Sprache C++; die Nachfolgeversion [http://lab.msdn.microsoft.com/express/visualc/ Visual C++ 2005 Express] ist z.Zt. (2005) kostenlos erhältlich (als [[Beta-Version]])
|| Windows
|-----
|style="white-space:nowrap;"| ''[[C-Plusplus-Builder|Borland C++ Builder]]''
| Grafisches Entwicklungswerkzeug zur einfachen und schnellen Anwendungsentwicklung; integrierte Entwicklungsumgebung; kann auch [[Pascal (Programmiersprache)|Pascal]]-Module (''[[Borland Delphi|Delphi]]'') kompilieren und debuggen || Windows
|-----
|style="white-space:nowrap;"| ''[http://www.bloodshed.net/devcpp.html Bloodshed C++ IDE]''
| Compiler und [[integrierte Entwicklungsumgebung|IDE]], Freeware mit vollständiger C++-Standardbibliothek || Windows
|-----
|style="white-space:nowrap;"| ''[http://www.openwatcom.org/ Open Watcom]''
| Compiler und [[integrierte Entwicklungsumgebung|IDE]] mit Unterstützung älterer Plattformen, bisher noch ohne vollständige C++-Standardbibliothek || DOS, Windows, OS/2, Netware (Linux-Unterstützung in Arbeit)
|-----
|style="white-space:nowrap;"| ''[http://www.pathscale.com/ekopath.html Pathscale EKOPath]''
| Ein Compiler, der speziell für die Entwicklung von 64-Bit Linux Cluster Anwendungen ausgelegt ist. Binärkompatibel zum GCC. || Linux
|}
<!-- Bitte auch die Spalte "Kommentar" nutzen. :-) -->


1983 wurde ''C with Classes'' in ''C++'' umbenannt. Erweiterungen darin waren: Überladen von Funktionsnamen und Operatoren, virtuelle Funktionen, Referenzen, Konstanten, eine änderbare Freispeicherverwaltung und eine verbesserte Typüberprüfung. Die Möglichkeit von Kommentaren, die an das Zeilenende gebunden sind, wurde aus BCPL übernommen (<code>//</code>).
''Siehe auch:'' [[Compiler|Kommandozeilen-Compiler]], [[Visuelle Programmierumgebung]]


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 [[Objektorientierte Programmierung|Mehrfachvererbung]], abstrakte Klassen, statische Elementfunktionen, konstante Elementfunktionen und die Erweiterung des Zugriffsmodells um <code>protected</code>. 1990 erschien das Buch ''The Annotated C++ Reference Manual'', das als Grundlage für den darauffolgenden Standardisierungsprozess diente.
== Literatur ==

<!-- *[[Richard Kaiser]]: ''C++ mit dem Borland C++ Builder'', Springer Xpert.press, ISBN 3-540-62994-7, ein sehr gutes und verständliches Buch, fürs Studium geeignet, sehr empfehlenswert -->
Relativ spät wurden der Sprache ''Templates'', ''Ausnahmebehandlung'', ''Namensräume'', neuartige ''Typumwandlungen'' und ''boolesche Typen'' hinzugefügt.
*[[Bjarne Stroustrup]]: ''Die C++ Programmiersprache'', Addison-Wesley, ISBN 3-8273-1660-X, ''das'' Standardwerk zu C++, Grundkenntnisse zu C von Vorteil; sehr empfehlenswert

*Andrew Koenig, Barbara E. Moo: ''Intensivkurs C++'', Pearson Studium, ISBN 3-8273-7029-9, hervorragendes Anfängerbuch, ein gewisses Grundverständnis zu Programmierung von Vorteil; sehr empfehlenswert
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 <code>printf()</code> und <code>scanf()</code> bietet. Eine der wesentlichen Erweiterungen der Standardbibliothek kam später durch die Integration großer Teile der bei [[Hewlett-Packard]] entwickelten [[Standard Template Library]] (''STL'') hinzu.
*Scott Meyers: ''Effektiv C++ programmieren - 50 Wege zur Verbesserung ihrer Programme und Entwürfe'', Addison-Wesley, ISBN 3-8273-1305-8, zur Vertiefung bereits vorhandener C++-Kenntnisse; sehr empfehlenswert

*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; sehr empfehlenswert
==== Standardisierung ====
*[[Herb Sutter]]: ''Exceptional C++'', ISBN 3-8273-1711-8 (deutsch), Vertiefung vorhandener C++-Kenntnisse; sehr empfehlenswert
Nach jahrelanger Arbeit wurde schließlich 1998 die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt. Diese Version wurde im Nachhinein, als weitere Versionen der Sprache erschienen, auch ''C++98'' genannt. Im Jahr 2003 wurde ISO/IEC 14882:2003 verabschiedet, eine Nachbesserung der Norm von 1998, in der einige Missverständnisse beseitigt und mehrere Details klarer formuliert wurden. Diese Version wird umgangssprachlich auch ''C++03'' genannt.
*[[Andrei Alexandrescu]]: ''Modernes C++ Design - Generische Programmierung und Entwurfsmuster angewendet'', mitp, ISBN 3-8266-1347-3, ''das'' Standardwerk zur [[C-Plusplus-Metaprogrammierung|C++-Metaprogrammierung]], setzt ein tiefes Verständnis von C++ voraus; sehr empfehlenswert

<!-- Neue Einträge bitte auf der Diskussionsseite begründen. Einen Kommentar zu Stärken und Schwächen des jeweiligen Buches hinzufügen!! -->
=== Weiterentwicklung der Programmiersprache C++ nach 2005 ===
Um mit den aktuellen Entwicklungen der sich schnell verändernden Computer-Technik Schritt zu halten, aber auch zur Ausbesserung bekannter Schwächen, erarbeitete das C++-Standardisierungskomitee die nächste größere Revision von C++, die inoffiziell mit '''C++0x''' abgekürzt wurde, worin die Ziffernfolge eine grobe Einschätzung des möglichen Erscheinungstermins andeuten sollte. Später, als ein Erscheinungstermin bis Ende 2009 nicht mehr zu halten war, änderte sich der inoffizielle Name zu ''C++1x''.

Die vorrangigen Ziele für die Weiterentwicklung von C++ waren Verbesserungen im Hinblick auf die Systemprogrammierung sowie zur Erstellung von Programmbibliotheken. Außerdem sollte die Erlernbarkeit der Sprache für Anfänger verbessert werden.

Im November 2006 wurde der Zieltermin für die Fertigstellung auf das Jahr 2009 festgelegt. Im Juli 2009 wurde dieser Termin auf frühestens 2010 geändert. Im August 2011 wurde die Revision einstimmig von der [[International Organization for Standardization|ISO]] angenommen<ref>[https://www.heise.de/newsticker/meldung/C-11-einstimmig-als-Standard-angenommen-1322726.html ''C++11 einstimmig als Standard angenommen.''] auf [[Heise online]], 13.&nbsp;August 2011.</ref> und am 11. Oktober 2011 als ISO/IEC 14882:2011 offiziell veröffentlicht.<ref>[https://www.heise.de/newsticker/meldung/Neue-C-Version-als-ISO-IEC-Standard-veroeffentlicht-1358642.html ''Neue C++-Version als ISO/IEC-Standard veröffentlicht.''] Heise online, 11.&nbsp;Oktober 2011.</ref><ref>[http://www.golem.de/1110/86960.html ''Programmiersprache: ISO veröffentlicht C++11.''] [[Golem.de]], 11.&nbsp;Oktober 2011.</ref> Inoffiziell heißt die Version '''C++11'''.

==== Verbesserungen am Sprachkern ====
C++98 deckte einige typische Problemfelder der Programmierung noch nicht ausreichend ab, zum Beispiel die Unterstützung von Nebenläufigkeit ([[Thread (Informatik)|Threads]]), deren Integration in C++, insbesondere für die Verwendung in Mehrprozessorumgebungen, eine Überarbeitung der Sprache unumgänglich machte. Durch die Einführung eines Speichermodells wurden Garantien der Sprache für den nebenläufigen Betrieb festgelegt, um Mehrdeutigkeiten in der Abarbeitungsreihenfolge sowohl aufzulösen als auch in bestimmten Fällen aufrechtzuerhalten und dadurch Spielraum für Optimierungen zu schaffen.

Zu den weitreichenderen Spracherweiterungen gehörte ferner die [[Typinferenz|automatische Typableitung]] zur Ableitung von Ergebnistypen aus Ausdrücken und die sogenannten ''R-Wert-Referenzen'', mit deren Hilfe sich als Ergänzung zu dem bereits vorhandenen ''Kopieren'' von Objekten dann auch ein ''Verschieben'' realisieren lässt, außerdem bereichsbasierte For-Schleifen ([[foreach]]) über Container und eingebaute Felder.<ref>{{Internetquelle |url=http://www.stroustrup.com/C++11FAQ.html |titel=C++11 – the new ISO C++ standard |werk=www.stroustrup.com |sprache=en |abruf=2018-09-22}}</ref>

==== Erweiterung der Programmbibliothek ====
Im April 2006 gab das C++-Standardisierungskomitee den sogenannten ersten Technischen Report (TR1) heraus, eine nicht normative Ergänzung zur aktuell gültigen, 1998 definierten Bibliothek, mit der Erweiterungsvorschläge vor einer möglichen Übernahme in die [[C++-Standardbibliothek]] auf ihre Praxistauglichkeit hin untersucht werden sollen. Viele Compiler-Hersteller lieferten den TR1 mit ihren Produkten aus.

Im TR1 waren u.&nbsp;a. [[Regulärer Ausdruck|reguläre Ausdrücke]],<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1429.htm ''A Proposal to add Regular Expressions to the Standard Library.''] bei ''Open Standards.'' 3.&nbsp;März 2003 (englisch).</ref> verschiedene [[Intelligenter Zeiger|intelligente Zeiger]],<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1450.html ''A Proposal to Add General Purpose Smart Pointers to the Library Technical Report''.] bei ''Open Standards.'' 27.&nbsp;März 2003 (englisch)</ref> [[Hashtabelle|ungeordnete assoziative]] [[Container (Informatik)|Container]],<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html ''A Proposal to Add Hash Tables to the Standard Library.''] bei ''Open Standards.'' 9.&nbsp;April 2003 (englisch).</ref> eine Zufallszahlenbibliothek,<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1452.html ''A Proposal to Add an Extensible Random Number Facility to the Standard Library.''] bei ''Open Standards.'' 10.&nbsp;April 2003 (englisch).</ref> Hilfsmittel für die C++-Metaprogrammierung, [[Tupel (Informatik)|Tupel]]<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2002/n1403.pdf ''Proposal for adding tuple types into the standard library.''] (PDF; 164&nbsp;kB) bei ''Open Standards.'' 8.&nbsp;November 2002 (englisch).</ref> sowie [[Numerik|numerische]] und mathematische Bibliotheken enthalten.<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1422.html ''A Proposal to Add Mathematical Special Functions to the C++ Standard Library.''] bei ''Open Standards.'' 24.&nbsp;Februar 2003 (englisch).</ref> Die meisten dieser Erweiterungen stammten aus der [[Boost (C++-Bibliothek)|Boost-Bibliothek]], woraus sie mit minimalen Änderungen übernommen wurden. Außerdem waren sämtliche Bibliothekserweiterungen der 1999 überarbeiteten Programmiersprache C (C99) in einer an C++ angepassten Form enthalten.<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1568.htm ''ISO/IEC JTC1/SC22/WG21 N1568.''] bei ''Open Standards'', von 2004 (englisch).</ref>

Mit Ausnahme der numerischen und mathematischen Bibliotheken wurden alle TR1-Erweiterungen in die Sprachnorm C++11 übernommen. Ebenfalls wurde eine eigene Bibliothek zur Unterstützung von Threads eingeführt.

==== C++11 ====
Mit der Norm ISO/IEC 14882:2011, auch bekannt als ''C++11'', wurden viele weitreichende Neuerungen in C++ eingeführt, wie auszugsweise:
* Lambdas ([[Anonyme Funktion]]en), welche vor der Verabschiedung des ''C++11''-Standards in anderen Sprachen schon teils breite Anwendung fanden, erweitern die Sprache vor allem im Bereich der funktionalen Programmierung.
* Eine erleichterte Typbehandlung mit [[Typinferenz]] ist nun über das Schlüsselwort <code>auto</code> (das nun nicht mehr ein Speicherklassen-Specifier ist) einerseits und das Schlüsselwort <code>decltype</code> (das den Typ eines Ausdrucks statisch zur Compilezeit zurückgibt, sofern ermittelbar) andererseits möglich. Beide Schlüsselworte zeigen ihre Stärke zudem auch im Verbund. So können ganze Funktionen, deren Rückgabetypen beispielsweise nur schwer vom Programmierer einzusehen sind, weil sie beispielsweise innerhalb komplexerer Klassentemplates liegen, komfortabel definiert werden:<!--
--><syntaxhighlight lang="cpp" style="margin-left:3em;">
template <typename Factory>
auto createObject(const Factory& creator) -> decltype(creator.makeObject()) {
return creator.makeObject();
}
</syntaxhighlight>
* Streng typisierte <code>enum</code>s (<code>enum class</code>) beseitigen Probleme mit Namenskollisionen und schränken die Fehleranfälligkeit in Bezug auf implizite Typkonvertierungen ein.
* Sogenannte „range-based loops“ mittels eines modifizierten <code>for</code>-Statements erleichtern die Arbeit mit Containern und Arrays in der Art, dass Iteratoren beim Traversieren von Objekten dieser Datentypen für viele Anwendungsfälle überflüssig werden:<!--
--><syntaxhighlight lang="cpp" style="margin-left:3em;">
#include <iostream>
#include <string>
#include <vector>

using namespace std;

void printNames(const vector<string>& names) {
for (const string& singleName: names)
cout << singleName << endl;
}
</syntaxhighlight>
* Es dürfen direkt aufeinanderfolgende spitze Klammern bei Templates benutzt werden: <code>map<int, vector<int'''>>'''</code>.
* Überdies erfolgte mit der Einführung von variadischen (vielstelligen) Templates eine großräumige Erweiterung der Nutzungsmöglichkeiten von Templates. Diese ermöglichen nun eine nicht fixe Anzahl von Template-Argumenten <code> template<typename... Values> class VariadicExampleClass;</code>, was weitreichende Optionen und Vereinfachungen im Code- bzw. Algorithmenaufbau und der Codestruktur allgemein ermöglicht. Des Weiteren haben sie, wie viele andere ''C++11''-Erweiterungen auch, das Potential, die Notwendigkeit zur Nutzung von teils fehleranfälligen und nicht robusten Macros weiter einzuschränken.
* Die explizite Nutzbarkeit sogenannter Rvalue-Referenzen ermöglicht, aufbauend unter anderem auf sogenannter Bewegungssemantik, ein breites Spektrum von Codevereinfachungen, Laufzeitoptimierungen und ausnahmesicherer Programmierung. Mit den Rvalue-Referenzen wurden auch die sogenannten universellen Referenzen eingeführt, welche das Problem des „Perfect forwarding“ auf Sprachebene robust und einfach lösbar machen (die konsistente Weiterreichung von Typen innerhalb von Templatekonstrukten, die per „type deduction“ aufgelöst wurden, an weiterführende Templates). Vor der Verabschiedung des ''C++11''-Standards war dies zumindest rein auf Sprachebene nicht möglich und erforderte vom Programmierer je nach Problemfall mehr oder weniger viel Eigenregie mit teils entsprechender Codeaufblähung und -Duplizierung.
* Außerdem wurden einige Features aus C11 übernommen, zum Beispiel Ganzzahlen mit mindestens 64 Bit (<code>long long</code>) oder Zusicherungen zur Übersetzungszeit mittels <code>static_assert</code> (in C11: <code>_Static_assert</code>).<ref>B. Stroustrup: [http://www.stroustrup.com/C++11FAQ.html C++11 FAQ]</ref>

Themen der Sprache C++, die Rechenzeit und Speicherplatz betreffen, wurden im sogenannten ''technical report'' ISO/IEC TR 18015:2006 behandelt.<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf ISO Technical Report on C++ Performance] (PDF; 1,2&nbsp;MB)</ref>

Zum Zeitpunkt der Einführung des Standards und auch noch vergleichsweise lange darüber hinaus unterstützten viele gängige Compiler diesen nicht vollständig bzw. mit Bezug auf einige Erweiterungen mitunter fehlerhaft. Besonders starke Einschränkungen zeigte diesbezüglich zum Beispiel Microsoft mit ''Visual C++ 2012''. Mit ''Visual C++ 2015'' sind mittlerweile jedoch nahezu alle wichtigen größeren Spracherweiterungen berücksichtigt worden.<ref>MSDN: [https://msdn.microsoft.com/de-de/library/hh567368.aspx Unterstützung für C++11/14/17-Funktionen (Modern C++)] Unterstützung von C++11/14/17-Features durch Microsoft-Compiler</ref><ref>The GNU Compiler Collection: [https://gcc.gnu.org/gcc-4.7/cxx0x_status.html Status of Experimental C++11 Support in GCC 4.7] Unterstützung von C++11-Features durch den gcc</ref>

==== C++14 ====
C++14, beschrieben im Standard ISO/IEC 14882:2014,<ref name="ISO14882-2014" /> erweitert die Einsatzmöglichkeiten von <code>auto</code> und <code>decltype</code>, schwächt die Voraussetzungen für <code>constexpr</code> ab, erlaubt Variablen-Templates zu definieren (beispielsweise um mehrere Versionen von π mit je nach Typ unterschiedlicher Genauigkeit zu definieren), führt Binärliterale ein (0b...), führt Hochkommata als Trennzeichen in Zahlen ein, erlaubt generische Lambdas, erweitert Lambda capture expressions und führt das Attribut <code>deprecated</code> ein.<ref name="ISO14882-2014" />

Außerdem wurde die Standardbibliothek um ein paar Funktionen ergänzt, die bei C++11 „vergessen“ bzw. „übersehen“ wurden (z.&nbsp;B. <code>std::make_unique</code>) und etliche Funktionsdeklarationen nun als <code>constexpr</code> umdeklariert, was dem Compiler aggressivere Optimierungen gestattet.

Während der Entwicklungsphase wurde C++14 auch ''C++1y'' genannt, um anzudeuten, dass es die Nachfolgeversion der vormals als C++0x genannten Version sein wird.

==== C++17 ====
Im März 2017 hat das ISO-C++-Komitee den Sprachstandard C++17 technisch abgeschlossen. Für die neue Fassung wurde unter anderem die Aufnahme des Typen <code>std::byte</code> beschlossen.<ref>{{Internetquelle |url=https://www.heise.de/developer/meldung/Programmiersprachen-C-17-ist-technisch-fertig-3664796.html |titel=Programmiersprachen: C++17 ist technisch fertig |hrsg=heise.de |abruf=2017-07-17}}</ref> Dieser ist explizit für den byte-weisen Zugriff auf den Speicher bestimmt. Es wurden neue, generische Container eingeführt: <code>std::any</code> als Alternative zu <code>void*</code> mit Typüberprüfung zur Laufzeit, <code>std::variant</code> als Alternative zur aus C übernommenen Union mit Laufzeit-Typprüfung und <code>std::optional</code>, ein Container, der genau ein Element enthalten kann, aber nicht muss.

Bis zur offiziellen Verabschiedung wurde die Fassung auch als ''C++1z'' bezeichnet.<ref>{{Internetquelle |url=http://clang.llvm.org/cxx_status.html#cxx17 |titel=C++ Support in Clang. C++17 implementation status |werk=clang.llvm.org |datum=2018-09-22 |sprache=en |abruf=2018-09-22}}</ref>

Nach dem Sommer-Meeting Mitte Juli verriet der C++-Experte [[Herb Sutter]], der für die Einberufung des Komitees verantwortlich ist, in seinem Blog<ref>{{Internetquelle |url=https://herbsutter.com/2017/07/15/trip-report-summer-iso-c-standards-meeting-toronto/ |titel=Trip report: Summer ISO C++ standards meeting (Toronto) |hrsg=herbsutter.com |sprache=en |abruf=2017-07-17}}</ref> bereits erste Pläne für C++20.

==== C++20 ====
Die finale Version von C++20 wurde im Dezember 2020 veröffentlicht, nachdem er im Februar finalisiert und im September bestätigt wurde.<ref>{{Internetquelle |autor= |url=https://www.iso.org/cms/render/live/en/sites/isoorg/contents/data/standard/07/93/79358.html |titel=ISO/IEC 14882:2020 |werk=iso.org |sprache=en |abruf=2022-01-31}}</ref>
* Concepts als Erweiterung zu Templates
* bestimmte Initialisierer (zuerst in [[Varianten der Programmiersprache C#C99|C99]])
* [=, this] in [[Lambda-Kalkül|Lambdas]]
* Template-Parameter-Listen in Parametern
* [[Dreiwegevergleich]] mit dem „spaceship operator“, <code>operator &lt;=&gt;</code>
* [[Koroutine]]n
* ein Modulsystem zur Codekapselung und kürzeren Kompilierzeiten<ref>{{Internetquelle |url=https://vector-of-bool.github.io/2019/01/27/modules-doa.html |titel=C++ Modules Might Be Dead-on-Arrival |werk=vector-of-bool.github.io |sprache=en |abruf=2019-05-21}}</ref>
* std::format zur String-Interpolation. Es handelt sich um typsicheren und durch den Benutzer erweiterbaren Ersatz für sprintf und stringstreams, der sich stark an Python anlehnt.
* std::span als Verallgemeinerung des Konzeptes von string_view (C++17). Ein ''span'' beschreibt einen Speicherbereich durch einen Pointer und eine Größenangabe.

==== C++23/26 ====
* Reflection
* Executors
* Pattern Matching
* Networking<ref>{{Internetquelle |url=https://www.reddit.com/r/cpp/comments/au0c4x/201902_kona_iso_c_committee_trip_report_c20/ |titel=r/cpp – 2019-02 Kona ISO C++ Committee Trip Report (C++20 design is complete; Modules in C++20; Coroutines in C++20; Reflection TS v1 published; work begins on a C++ Ecosystem Technical Report) |sprache=en |abruf=2019-08-22}}</ref>

=== Der Name „C++“ ===
Der Name C++ ist eine Wortschöpfung von Rick Mascitti, einem Mitarbeiter Stroustrups, und wurde zum ersten Mal im Dezember 1983 benutzt. Der Name kommt von der Verbindung der Vorgängersprache C und dem [[Inkrement und Dekrement|Inkrement]]-Operator <code>++</code>, der den Wert einer Variablen inkrementiert (um eins erhöht). Der Erfinder von C++, Bjarne Stroustrup, nannte C++ zunächst „C mit Klassen“ ''({{lang|en|C with classes}})''.<ref>{{Webarchiv |url=http://www2.research.att.com/~bs/bs_faq.html#invention |text=When was C++ invented? |wayback=20110926063620 |archiv-bot=}} (englisch) – FAQ-Eintrag bei ''[[AT&T Labs Research]]''; Stand: 4.&nbsp;Juli 2011.</ref>

== Kritik ==
Oft geäußerte Kritik an der Sprache umfasst beispielsweise:
<!-- Einige Kritikpunkte lehnen sich an den Inhalt von „Sprachdesign“ oben an -->
* C++ sei sehr komplex und fehleranfällig zu programmieren. Man müsse viel lernen und üben, um es gut zu beherrschen, und viele Features gelten als äußerst komplex.<ref>{{Internetquelle |autor=Ian Joyner |url=http://www.literateprogramming.com/c++critique.pdf |titel=C++?? A Critique of C++ |datum=1992-11 |seiten=27–29 |format=PDF |sprache=en |abruf=2015-06-06}}</ref>
* C++ sei zu ''low-level''-mäßig aufgebaut; während es viele Features von höher abstrahierenden Sprachen aufweist (Klassen, generische Klassen/Funktionen etc.), seien als wichtig empfundene Dinge, insbesondere [[Garbage Collection]], nicht vorhanden.<ref name="GarbageCollection" />
* C++ gilt zwar als schnell, beispielsweise wegen der Möglichkeit, frei mit Pointern zu arbeiten, doch diese Leistung sei auf den heutigen, schnellen Computersystemen nur in Ausnahmefällen nötig: Während es sinnvoll sei, Betriebssysteme o.&nbsp;Ä. in C++ zu schreiben, sei es softwaretechnisch viel günstiger, Anwendungsprogramme in [[Höhere Programmiersprache|höheren Sprachen]] zu schreiben, da diese leichter zu warten seien und immer noch eine ausreichende Leistung aufwiesen.<ref>{{Internetquelle |url=http://www.codinghorror.com/blog/2007/01/the-problem-with-c.html |titel=The Problem With C++ |werk=www.codinghorror.com |datum=2007-01-12 |sprache=en |abruf=2018-09-22 |archiv-url=https://web.archive.org/web/20140226162552/http://www.codinghorror.com/blog/2007/01/the-problem-with-c.html |archiv-datum=2014-02-26 |offline=ja |archiv-bot=2024-08-09 09:11:55 InternetArchiveBot }}</ref>
* Typisch in Verbindung mit C++ ist das Zitat von Bjarne Stroustrup:
{{Zitat
|Text=In C++ it’s harder to shoot yourself in the foot, but when you do, you blow off your whole leg.
|Sprache=en
|Autor=
|Quelle=
|Übersetzung=In C++ ist es schwieriger, sich selbst in den Fuß zu schießen, aber wenn man es tut, dann ist gleich das ganze Bein weg.
|ref=<ref>{{Internetquelle |url=http://www.stroustrup.com/bs_faq.html#really-say-that |titel=Bjarne Stroustrup's FAQ. Did you really say that? |werk=www.stroustrup.com |datum=2018-03-18 |sprache=en |abruf=2018-09-22}}</ref>
}}

: Soll heißen: C++ erleichtert zunächst vieles, aber es bringt gleichzeitig viele Mittel mit sich, die mit Bedacht eingesetzt werden müssen. Zum Beispiel können durch die dynamische Speicherallokation ohne [[Garbage Collection|automatische Speicherfreigabe]] [[Speicherleck]]s entstehen. Zeiger können auf falsche Speicherbereiche verweisen und verstecktes Fehlverhalten erzeugen ([[Hängender Zeiger]]).


== Siehe auch ==
== Siehe auch ==
* [[Boost]]
* [[C++/CLI]]
* [[Embedded C++]], ein Dialekt von C++, bei dem einige Sprachfeatures und Bibliotheksfunktionen entfernt wurden, um für [[Eingebettetes System|eingebettete Systeme]] geeigneter zu sein.
* [[:en:b:Programming:C plus plus|C++-Programmierung bei Wikibooks (engl.)]]
* [[Argument dependent name lookup]]
* [[C-Plusplus-Glossar|C++-Glossar]]

* [[C-Plusplus-Standardbibliothek|C++-Standardbibliothek]]
== Literatur ==
* [[Template (Programmierung)|Templates (Schablonen)]]
* {{Literatur
* [[C-Plusplus-Metaprogrammierung|C++-Metaprogrammierung]] (siehe auch [[Metaprogrammierung]])
|Autor=[[Bjarne Stroustrup]]
* [[C-Plusplus/CLI|C++/CLI]].
|Titel=Die C++-Programmiersprache: Aktuell zu C++11
* [[Ressourcenbelegung ist Initialisierung|RAII]] ('''''r'''esource '''a'''cquisition '''i'''s '''i'''nitialization'')
|Verlag=Carl Hanser
* [[Escape-Sequenz]]
|Datum=2015
* [[C (Programmiersprache)]]
|ISBN=978-3-446-43961-0
|Kommentar=Standardwerk zu C++, Grundkenntnisse in C von Vorteil}}
* {{Literatur
|Autor=Bjarne Stroustrup
|Titel=The Design and Evolution of C++
|Verlag=Addison-Wesley
|Datum=1994
|ISBN=0-201-54330-3
|Kommentar=Buch beschreibt die Entwicklung und das Design von C++; vom Sprachdesigner geschrieben}}
* {{Literatur |Autor=Bjarne Stroustrup |Titel=Programming – Principles and Practice Using C++ |Auflage=3. überarbeitete |Verlag=Addison-Wesley |Datum=2024 |ISBN=978-0-138-30868-1 |Kommentar=Einführung in die Programmierung; Standardwerk für Einstiegsprogrammierkurse an der Universität Texas A&M}}
* {{Literatur
|Autor=[[Herb Sutter]]
|Titel=Exceptional C++
|Auflage=1.
|Verlag=Addison-Wesley
|Datum=2000
|ISBN=3-8273-1711-8
|Kommentar=Vertiefung vorhandener C++-Kenntnisse.}}
* {{Literatur
|Autor=[[Andrei Alexandrescu]]
|Titel=Modernes C++ Design – Generische Programmierung und Entwurfsmuster angewendet
|Auflage=1.
|Verlag=Mitp-Verlag
|Datum=2003
|ISBN=3-8266-1347-3
|Kommentar=Ein Standardwerk zur [[C++-Metaprogrammierung]], setzt ein tiefes Verständnis von C++ voraus.}}
* {{Literatur |Autor=[[Ulrich Breymann]] |Titel=C++ programmieren: C++ lernen – professionell anwenden – Lösungen nutzen |Auflage=7. überarbeitete |Verlag=Carl Hanser |Datum=2023 |ISBN=978-3-446-47689-9 |Kommentar=C++-Einführung aus dem Hochschulumfeld}}
* {{Literatur
|Autor=[[Sibylle Schupp]]
|Titel=A Semantic Definition of Separate Type Checking in C++ with Concepts
|TitelErg=(wissenschaftlicher Artikel)
|Sammelwerk=Journal of Object Technology
|Band=8
|Nummer=5
|Datum=2009
|DOI=10.5381/jot.2009.8.5.a2
|Seiten=105–132}}


== Weblinks ==
== Weblinks ==
{{Wikibooks|C++-Programmierung}}
* [http://www.cppreference.com/ C++ Online-Referenz], englisch
{{Wiktionary}}
* [http://www.fmi.uni-konstanz.de/~kuehl/c++-faq/ Oft gestellte Fragen und Antworten], englisch
* [http://www.open-std.org/jtc1/sc22/wg21/ Webauftritt des C++-Standardisierungskomitees] (englisch)
* [http://groups.google.de/groups?group=de.comp.lang.iso-c%2B%2B C++-Diskussionsgruppe], deutsch
* [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf Working Draft, Standard for Programming Language C++] (englisch, PDF, 5,1&nbsp;MB)
* [http://www.c-plusplus.de/forum C++-Forum], deutsch
* [https://isocpp.org/ Standard C++ Foundation] (englisch)
* [http://www.comeaucomputing.com/tryitout/ Comeau's Online-Compiler], zum Kompilieren einfacher Programme per Web
* [https://www.stroustrup.com/ Website von Bjarne Stroustrup mit dessen FAQs und starkem C++-Fokus] (englisch)
* [http://www.accu.org/ ACCU], internationale Interessengemeinschaft für C und C++
* [https://en.cppreference.com/w/ C++ Reference]; Wiki zu C++ (primär englisch)
* [http://www.boost.org/ Die C++-Bibliothek] von [[Boost]]
* [https://fbb-git.gitlab.io/cppannotations/ C++ Annotations], umfangreiche Einführung von Frank B. Brokken (englisch)
* [http://boost-consulting.com/tmpbook/ C++-Metaprogrammierung]

* [http://gcc.gnu.org/ Internetseite des GNU-C++-Compilers]
== Einzelnachweise ==
* [http://www.hpl.hp.com/personal/Hans_Boehm/gc/ Hans Boehms Garbage-Collector für C++]
<references responsive />
* [http://www.wikiservice.at/dse/wiki.cgi?SpracheCpp C++ im Deutschen Software Entwickler Wiki]

* [http://www.pathscale.com/ekopath.html Pathscale ECOPath-Compiler]
{{Normdaten|TYP=s|GND=4193909-8}}
* [http://www.cuj.com/ C/C++ Users Journal]
<!-- Bitte nur hochwertige Links hinzufügen!! -->


<!-- „| “ sorgt dafür, dass der Artikel als Oberartikel der Kategorie erkannt wird. Bitte _nicht_ löschen! -->
[[Kategorie:Programmiersprache]]
[[Kategorie:Programmiersprache C-Plusplus]]
<!-- Kategorie:Programmiersprache bitte NICHT hinzufügen, Programmiersprache C++ ist die richtige (Unter-)Kategorie. -->


[[Kategorie:C++| ]]
[[ar:سي بلس بلس]]
[[Kategorie:Imperative Programmiersprache]]
[[bg:Си плюс плюс]]
[[Kategorie:Objektorientierte Programmiersprache]]
[[ca:C plus plus]]
[[Kategorie:Programmiersprache mit einem ISO-Standard]]
[[cs:Cplusplus]]
[[da:C plus plus]]
[[en:C Plus Plus]]
[[eo:C Plus Plus]]
[[es:C más más]]
[[et:C pluss pluss]]
[[fi:C plus plus]]
[[fr:C plus plus]]
[[he:C Plus Plus]]
[[it:C plus plus]]
[[ja:C Plus Plus]]
[[ko:C 플러스 플러스]]
[[lb:C-Plusplus]]
[[lt:C plius plius]]
[[nb:C Pluss Pluss]]
[[nl:Cplusplus]]
[[pl:C plus plus]]
[[pt:C mais mais]]
[[ro:C plus plus]]
[[ru:Си плюс плюс]]
[[sk:C Plus Plus]]
[[sv:C Plus Plus]]
[[tr:C artı artı]]
[[uk:C Plus Plus]]
[[zh:C++]]

Aktuelle Version vom 2. Juni 2025, 12:10 Uhr

C++
C++-Logo
Basisdaten
Paradigmen: Multiparadigmen (generisch, imperativ, objektorientiert, prozedural, strukturiert, funktional)
Erscheinungsjahr: 1983
Designer: Bjarne Stroustrup
Entwickler: Bjarne Stroustrup
Aktuelle Version C++23[1] (19. Oktober 2024)
Aktuelle Vorabversion: C++ 26  ()
Typisierung: statisch (dynamische Typprüfung möglich), implizit, stark
Wichtige Implementierungen: C++Builder, GCC, MS Visual C++, Intel C++ Compiler, Clang/LLVM
Standardisierungen: ISO/IEC 14882:1998,
ISO/IEC 14882:2003,
ISO/IEC TR 19768:2007,
ISO/IEC 14882:2011,
ISO/IEC 14882:2014[2],
ISO/IEC 14882:2017[3],
ISO/IEC 14882:2020[4],
ISO/IEC 14882:2024[5]
Beeinflusst von: C, Simula, Algol 68, CLU, Meta Language, Ada
Beeinflusste: Ada 95, Chapel, C#, D, Go, Java, Nim, Perl, PHP, Python[6], Vala, Rust, Seed7
isocpp.org

C++ ist eine von der ISO genormte Programmiersprache. Sie wurde ab 1979 von Bjarne Stroustrup bei AT&T als Erweiterung der Programmiersprache C entwickelt. C++ ermöglicht sowohl die effiziente und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau. Der Standard definiert auch eine Standardbibliothek, zu der verschiedene Implementierungen existieren.

C++ wird sowohl in der Systemprogrammierung als auch in der Anwendungsprogrammierung eingesetzt und gehört in beiden Bereichen zu den verbreitetsten Programmiersprachen.[7]

Systemprogrammierung

[Bearbeiten | Quelltext bearbeiten]

Typische Anwendungsfelder in der Systemprogrammierung sind Betriebssysteme, eingebettete Systeme, virtuelle Maschinen, Treiber und Signalprozessoren. C++ nimmt hier oft den Platz ein, der früher ausschließlich Assemblersprachen und der Programmiersprache C vorbehalten war.

Anwendungsprogrammierung

[Bearbeiten | Quelltext bearbeiten]

Bei der Anwendungsprogrammierung kommt C++ vor allem dort zum Einsatz, wo hohe Anforderungen an die Effizienz gestellt werden, um durch technische Rahmenbedingungen vorgegebene Leistungsgrenzen möglichst gut auszunutzen. Ab dem Jahr 2000 wurde C++ aus der Domäne der Anwendungsprogrammierung von den Sprachen Java und C# zurückgedrängt.

Die Sprache C++ verwendet nur etwa 60 Schlüsselwörter („Sprachkern“), manche werden in verschiedenen Kontexten (static, default) mehrfach verwendet. Ihre eigentliche Funktionalität erhält sie, ähnlich wie auch die Sprache C, durch die C++-Standardbibliothek, die der Sprache fehlende wichtige Funktionalitäten beibringt (Arrays, Vektoren, Listen, …) wie auch die Verbindung zum Betriebssystem herstellt (iostream, fopen, exit, …). Je nach Einsatzgebiet kommen weitere Bibliotheken und Frameworks dazu. C++ legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken. Dadurch favorisiert es verallgemeinerte Mechanismen für typische Problemstellungen und besitzt kaum in die Sprache integrierte Einzellösungen.

Eine der Stärken von C++ ist die Kombinierbarkeit von effizienter, maschinennaher Programmierung mit mächtigen Sprachmitteln, die einfache bis komplexe Implementierungsdetails zusammenfassen und weitgehend hinter abstrakten Befehlsfolgen verbergen. Dabei kommt vor allem die Template-Metaprogrammierung zum Zuge: Eine Technik, die eine nahezu kompromisslose Verbindung von Effizienz und Abstraktion erlaubt.

Einige Design-Entscheidungen werden allerdings auch häufig kritisiert:

Ressourcenverwaltung

[Bearbeiten | Quelltext bearbeiten]

C++ hat keine Garbage Collection. Bis Version 20 gab es minimale Funktionalitäten für eine Garbage-Collection. Es gibt Bestrebungen, eine funktionale Garbage-Collection durch Bibliotheken oder durch Aufnahme in den Sprachstandard zu ermöglichen.[8][9][10] Siehe auch Boehm-Speicherbereinigung. Mit Version 23 wurde die im Code implementierte Garbage Collection vollständig entfernt.[11][12]

Es ist möglich, die Speicherverwaltung von C (malloc/realloc/free) zu verwenden; zur Implementierung von Low-Level-Funktionen in Bibliotheken wie der C++-Standardbibliothek ist dies zum Zugriff auf C Bibliotheksfunktionen notwendig. In allgemeinem C++-Code wird hiervon jedoch dringend abgeraten.[13] Stattdessen ist es dort üblich, die Speicherverwaltung von der C++-Standardbibliothek übernehmen zu lassen, indem man die angebotenen Containerklassen verwendet.

Andere Ressourcen, z. B. Dateihandles oder Netzwerksockets werden in C++ üblicherweise in eigenen Klassen mit dem Prinzip RAII verwaltet, um das automatische Aufräumen nach der Verwendung sicherzustellen. Dies ist konzeptionell in anderen Programmiersprachen oft mit der Implementierung spezieller Basisklassen/Schnittstellen gestaltet – wie z. B. „AutoCloseable“ in Java oder „IDisposable“ in C#. In anderen Programmiersprachen benötigen diese nicht verwalteten Ressourcen oft ein spezielles Handling (z. B. „using“-Schlüsselwort in C#), um die Lebenszeit dieser Objekte ausnahmesicher in Verbindung mit dem Garbage Collector zu verwalten. Die RAII-basierten Implementierungen in C++ sind konzeptbedingt nicht anfällig bezüglich dieser Probleme, da Speicher in C++ keinen Sonderstatus als Ressource hat. Eine korrekte Implementierung der Objektlebenszeit garantiert hier die Freigabe aller Ressourcen.

Für Verweise auf Objekte werden üblicherweise Referenzen verwendet, solange der Verweis das Objekt nicht besitzen soll – z. B. als Parameter bei Funktionsaufrufen. Um den Besitz von dynamisch allokierten Objekten zu verwalten, werden üblicherweise Smart Pointer eingesetzt, welche die Destruktion und Speicherfreigabe übernehmen. Die Standardbibliothek unterscheidet hier strikt den Besitz. Während beim unique_ptr nur dieser Zeiger den Speicher besitzt, kann der Besitz des Speichers beim shared_ptr zwischen mehreren Zeigerinstanzen geteilt werden. Technisch realisiert ist dies beim shared_ptr meist mit Reference counting.[14]

Unvollständige Objektorientierung

[Bearbeiten | Quelltext bearbeiten]
Sichtbarkeit privater Elemente
[Bearbeiten | Quelltext bearbeiten]

In C++ gehören private Eigenschaften (Variablen und Methoden) normalerweise mit zur Schnittstelle, die in der Header-Datei veröffentlicht ist. Dadurch entstehen zur Compilezeit und zur Laufzeit Abhängigkeiten der Objekte zu den Stellen, die sie verwenden.

Diese Abhängigkeiten können durch bestimmte Konstruktionen, wie dem pimpl-Idiom (pointer to implementation idiom), vermieden werden. Dabei werden die privaten Felder der Klasse (example_class) in eine private, vorwärts-deklarierte Hilfsklasse verschoben, und ein Zeiger auf ein Objekt dieser Hilfsklasse (example_class::impl * impl_ptr) bleibt in der eigentlichen Klasse. Die Definition der implementierenden Klasse findet bei der Implementierung der öffentlichen Klasse statt und ist damit für den Verwender der Klasse (der nur die Header-Datei kennt) unsichtbar. Dadurch, dass die Hilfsklasse nur durch einen Zeiger referenziert wird, bleiben alle Quelltextänderungen an privaten Feldern transparent und die Binärkompatibilität wird erhalten.[15]

Unvollständige Kapselung
[Bearbeiten | Quelltext bearbeiten]

In C++ sind die Speicherbereiche der einzelnen Objekte zur Laufzeit nicht vor (absichtlichen oder versehentlichen) gegenseitigen Änderungen geschützt.

Undefiniertes Verhalten

[Bearbeiten | Quelltext bearbeiten]

Das Verhalten von einigen Sprachkonstrukten ist nicht definiert. Dies bedeutet, dass der Standard weder vorgibt noch empfiehlt, was in einem solchen Fall passiert. Die Auswirkungen reichen von Implementierungsabhängigkeit (d. h. je nach Zielrechner und Compiler kann sich das Konstrukt unterschiedlich verhalten) über unsinnige Ergebnisse oder Programmabstürze bis hin zu Sicherheitslücken. Einige dieser Freiheiten des Compilers lassen zusätzliche Optimierungen des Codes zu.

Es kommt zu unterschiedlichem Verhalten bei

  • verschiedenen Compilern
  • verschiedenen Compiler-Versionen
  • verschiedener Architektur (ARM, x86, x64)
  • verschiedenen Optimierungseinstellungen (Debug, Release, Optimierung)
  • ausgewählter Befehlssatz, Aufrufkonventionen, u. v. a. m.

Quellcode mit Codepassagen mit undefiniertem Verhalten kann nach der Kompilierung unerwartetes und absurd erscheinenden Verhalten zeigen. So werden zu spät durchgeführte Überprüfungen wegoptimiert oder Schleifen, die auf einen ungültigen Index eines Arrays zugreifen, durch leere Endlosschleifen ersetzt.[16][17]

Wichtig für das Verständnis von undefiniertem Verhalten ist insbesondere, dass niemals nur eine einzelne Operation ungültig ist, sondern das gesamte Programm ungültig wird und kein wohlgeformtes C++ mehr darstellt. Der Grund ist, dass manche Arten von „undefiniertem Verhalten“ Auswirkungen auf ganz andere, auch in sich korrekte, Programmteile haben und deren Verhalten beeinflussen können, beispielsweise bei Pufferüberläufen oder der unbeabsichtigten Änderung von Prozessor-Flags, die durch eine ungültige arithmetische Operation verursacht wurde und die nachfolgenden Berechnungen beeinflussen kann.

Beispiele für undefiniertes Verhalten:

  • Überlauf von vorzeichenbehafteten Ganzzahlen (auch z. B. bei Umwandlung von unsigned int nach int)
  • Nullzeiger-Dereferenzierungen
  • Arrayzugriffe mit ungültigem Index
  • Schiebeoperationen mit einer Schiebeweite, die negativ oder größergleich der Zahl der Bits des zu schiebenden Typs ist
  • Division durch null mit integralen Datentypen
  • Weglassen des return-Statements in Funktionen mit Rückgabewert (die Hauptfunktion main bildet die einzige Ausnahme)
  • Ein Nebeneffekt ändert eine Variable, die mehrmals in dem Ausdruck (v[i] = i++;) oder in der Argumentliste (f(i, i++);) vorkommt (die Auswertungsreihenfolge von Teilausdrücken und Funktionsargumenten ist nicht festgelegt)

Einerseits ist das hieraus resultierende nichtdeterministische Laufzeitverhalten, insbesondere bei kleinen Änderungen der Plattform, mindestens als Risiko, in der Praxis oft aber als klarer Nachteil einzustufen. Andererseits werden hierdurch schnellere Programme ermöglicht, da Gültigkeitsüberprüfungen weggelassen werden können und der Compiler zudem oft Programmteile stärker optimieren kann, indem er Randfälle als per Definition ausgeschlossen ignoriert.

Ein oft nicht wahrgenommener Vorteil ist darüber hinaus, dass dadurch, dass undefiniertes Verhalten praktisch nur in äußerst fragwürdigen Konstrukten auftritt, die aber nicht zwingend während des Kompilierens feststellbar sind, unsemantischer oder anderweitig suboptimaler Code gewissermaßen verboten wird.

Beispielsweise besteht eine illegale Art zu prüfen, ob die Summe zweier positiver Ganzzahlen und vom Typ ‚int‘ verlustfrei wieder in einem ‚int‘ abgebildet werden kann, daraus, zu schauen, ob ihre Summe größer 0 ist (bei Überlauf entsteht auf den meisten Computern durch die Zweierkomplement-Arithmetik eine negative Zahl). Eine derartige Überprüfung ist allerdings aus mathematischer Sicht nicht besonders sinnvoll. Eine bessere (semantischere) Herangehensweise ist hier, die eigentliche Frage, ob , wobei die größte in einem ‚int‘ darstellbare Zahl ist, nach der mathematisch validen Umformung zu zu verwenden.[18]

Kompatibilität mit C

[Bearbeiten | Quelltext bearbeiten]

Um an die Verbreitung der Programmiersprache C anzuknüpfen, wurde C++ als Erweiterung von C gemäß dem damaligen Stand von 1990 (ISO/IEC 9899:1990, auch kurz C90 genannt) entworfen.

Die Kompatibilität mit C zwingt C++ zur Fortführung einiger dadurch übernommener Nachteile. Dazu zählt die teilweise schwer verständliche C-Syntax, der als überholt geltende Präprozessor sowie verschiedene von der jeweiligen Plattform abhängige Details der Sprache, die die Portierung von C++-Programmen zwischen unterschiedlichen Rechnertypen, Betriebssystemen und Compilern erschweren.

Einige C-Sprachkonstrukte haben in C++ eine leicht abgewandelte Bedeutung oder Syntax, so dass manche C-Programme erst angepasst werden müssen, um sich als C++-Programm übersetzen zu lassen. Weitere Änderungen an C fanden in den Jahren 1999 (ISO/IEC 9899:1999, aka C99) und 2011 (ISO/IEC 9899:2011, aka C11) also nach der ersten Normung von C++ statt, so dass dort eingeflossene Änderungen nicht in C++98 berücksichtigt werden konnten. In die C++-Revision von 2011 wurde ein Teil der Neuerungen von C99 übernommen; auf der anderen Seite wurden dem C-Standard neue Features hinzugefügt, die auch mit C++11 nicht kompatibel sind.

Sprachmerkmale im Detail

[Bearbeiten | Quelltext bearbeiten]

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 sowie neuartige Typumwandlungsmöglichkeiten, Klassen mit Mehrfachvererbung und virtuellen Funktionen, Ausnahmebehandlung, Templates (Schablonen), Namensräume, Inline-Funktionen, Überladen von Operatoren und Funktionsnamen, Referenzen, Operatoren zur Verwaltung des dynamischen Speichers und mit der C++-Standardbibliothek eine erweiterte Bibliothek.

Programmbeispiel

[Bearbeiten | Quelltext bearbeiten]

Der folgende Quelltext ist ein einfaches C++-Programm, das den Text „Hallo Welt!“ in den Standardausgabestrom, üblicherweise das Terminal, schreibt:

#include <iostream>

int main() {
    std::cout << "Hallo Welt!" << std::endl;
    return 0;
}

Der Präprozessorbefehl oder auch Präprozessordirektive genannt #include bindet Header-Dateien ein, die typischerweise Deklarationen von Variablen, Typen und Funktionen enthalten. Im Gegensatz zu C besitzen Header der C++-Standardbibliothek keine Dateiendung.

Der Header <iostream> ist Teil der C++-Standardbibliothek und deklariert unter anderem den Standardeingabestrom std::cin und die Standardausgabeströme std::cout und std::cerr für die aus der C-Standardbibliothek bekannten Objekte stdin, stdout und stderr.

Bei main() handelt es sich um die Funktion, die den Einsprungpunkt jedes C++-Programms darstellt. Das Programm wird ausgeführt, indem die Funktion main() aufgerufen wird, wobei diese ihrerseits andere Funktionen aufrufen kann. Die Funktion main() selbst darf allerdings in einem C++-Programm nicht rekursiv aufgerufen werden.

Der Standard verlangt von Implementierungen, zwei Signaturen für die Funktion main() zu unterstützen: Eine ohne Funktionsparameter wie im Beispiel, und eine, die einen Integer und einen Zeiger auf Zeiger auf char entgegennimmt, um auf Kommandozeilenparameter zugreifen zu können (was nicht in allen Programmen vonnöten ist): int main(int argc, char **argv). Implementierungen dürfen darüber hinaus weitere Signaturen für main() unterstützen, alle müssen jedoch den Rückgabetyp int (Integer) besitzen, also eine Ganzzahl zurückgeben. Würde main() keinen Wert zurückgeben, schreibt der C++-Standard der Implementierung vor, return 0; anzunehmen. main() gibt also 0 zurück, wenn kein anderslautendes return-Statement in ihr vorhanden ist.[19]

std::cout ist eine Instanz der Klasse std::basic_ostream<char>, die sich wie die gesamte C++-Standardbibliothek im Namensraum std befindet. Bezeichner in Namensräumen werden mit dem Bereichsoperator (::) angesprochen.

Die Ausgabe des Zeichenkettenliterals "Hallo Welt" übernimmt der Operator <<. Zeichenkettenliterale sind in C++ vom Typ Array aus N konstanten chars (char const[N]), wobei N gleich der Länge der Zeichenkette + 1 für die abschließende Nullterminierung ist. Da die Standardtypumwandlungen von C++ die als pointer-to-array decay bekannte implizite Umwandlung eines Arrays T[N] in einen Pointer T* vorsehen, und damit char const[N] in einen char const* zerfällt, passt der überladene Operator template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *); aus <ostream> und wird entsprechend aufgerufen (operator<<( std::cout, "Hallo Welt!" );) und gibt die Zeichenkette aus. Durch den Ausgabemanipulator std::endl wird ein Zeilenendezeichen ausgegeben.

Bei return 0 wird dem aufrufenden Programm über das Betriebssystem mitgeteilt, dass die Ausführung des Programms erfolgreich war.

Typische Dateiendungen sind .C, .cc, .cpp, .cxx, .c++, .h, .hh, .hpp, .hxx, .h++, .ipp, .tpp, .ixx.

Die Implementierung eines C++-Compilers gilt als aufwendig. Nach der Fertigstellung der Sprachnorm 1998 dauerte es mehrere Jahre, bis die Sprache von C++-Compilern weitestgehend unterstützt wurde.

Zu den verbreitetsten C++-Compilern gehören:

Visual C++
Der in Microsoft Visual C++ enthaltene Compiler ist der am weitesten verbreitete für das Betriebssystem Windows. Die Community-Edition stellt Microsoft kostenlos zur Verfügung.
GCC
Der g++ ist die C++-Ausprägung der GNU Compiler Collection (GCC); g++ ist quelloffen und frei verfügbar. Der g++ unterstützt eine Vielzahl von Betriebssystemen (darunter Unix, Linux, macOS, Windows und AmigaOS) und Prozessorplattformen. GNU C++ existiert seit 1987 und ist somit einer der ältesten C++-Compiler.[20]
Clang
Clang, ein C++ Compiler-Frontend für plattformübergreifende Compilerinfrastruktur LLVM, die unter anderem auch in der Apple eigenen integrierten Entwicklungsumgebung Xcode verwendet wird.[21] Im Clang/LLVM Ecosystem sind auch mehrere Tools zur statischen Codeanalyse entstanden wie z. B. „clang-tidy“ und „clang-format“.
Intel C++ Compiler
Der Intel C++ Compiler verwendet ebenfalls das unten erwähnte C++-Front-End von EDG. Der Intel C++ Compiler erzeugt Maschinencode für die Intel-Prozessoren unter den Betriebssystemen Windows, Linux und macOS. Da die mit dem Intel C++ Compiler erzeugten Programme den Befehlssatz der Intel-Prozessoren besonders gut ausnutzen, erzeugen sie besonders effiziente Programme für diese Plattform. (Kompilate des Intel-Compilers laufen ebenfalls auf AMD-Chips meist schneller als Kompilate der alternativen Compiler, entsprechende Optimierungsflags sperrt Intel jedoch, wobei sich die Sperre aufheben lässt.) Der Intel C++ Compiler nutzt im Unterbau wesentliche Teile des g++ und ersetzt und erweitert Teile der Code-Optimierung und Code-Generierung.
Oracle Solaris Studio
Oracle Solaris Studio stellt Oracle kostenlos zur Verfügung.[22]
Comeau C++
Der Comeau C++. Das sogenannte „Front-End“ des Compilers, also der Teil, der die Analyse-Phase implementiert, wurde von der Firma Edison Design Group (EDG) entwickelt, die sich auf die Entwicklung von Compiler-Front-Ends spezialisiert hat und deren C++-Front-End auch in vielen anderen kommerziellen C++-Compilern integriert ist. Der Comeau-Compiler kann auch über das Internet ausprobiert werden.
Turbo C++
Mit Turbo C++/C++ Builder steht ein weiterer Compiler zur Verfügung.[23]

Integrierte Entwicklungsumgebungen

[Bearbeiten | Quelltext bearbeiten]

Freie Entwicklungsumgebungen

[Bearbeiten | Quelltext bearbeiten]

Proprietäre Entwicklungsumgebungen

[Bearbeiten | Quelltext bearbeiten]

Vergleich mit anderen Sprachen

[Bearbeiten | Quelltext bearbeiten]

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++ syntaktisch wie von ihrem Funktionsprinzip an Smalltalk und nicht an Simula orientierte. Die Syntax von Objective-C (C beeinflusst durch Smalltalk) unterscheidet sich erheblich von C++ (C beeinflusst von Simula mit ganz eigenen syntaktischen Erweiterungen). Ende der 1980er Jahre wurde Objective-C erstmals kommerziell in NeXTStep verwendet, in dem es einen zentralen Bestandteil darstellt. Heutzutage findet es in der Programmierschnittstelle OpenStep (bzw. Cocoa und GNUstep) sowie in den Betriebssystemen iOS und macOS ein wichtiges Einsatzgebiet.

Die Programmiersprachen Java und C# verfügen über eine ähnliche, ebenfalls an C angelehnte Syntax wie C++,[24] sind auch objektorientiert und unterstützen seit einiger Zeit Typparameter. Trotz äußerlicher Ähnlichkeiten unterscheiden sie sich aber konzeptionell von C++ zum Teil beträchtlich.

Generische Techniken ergänzen die objektorientierte Programmierung um Typparameter und erhöhen so die Wiederverwertbarkeit einmal kodierter Algorithmen. Die generischen Java-Erweiterungen sind jedoch lediglich auf Klassen, nicht aber auf primitive Typen oder Datenkonstanten anwendbar. Demgegenüber beziehen die generischen Spracherweiterungen von C# auch die primitiven Typen mit ein. Dabei handelt es sich allerdings um eine Erweiterung für Generik zur Laufzeit, die die auf Kompilationszeit zugeschnittenen C++-Templates zwar sinnvoll ergänzen, nicht aber ersetzen können.

Gerade die generische Programmierung macht C++ zu einem mächtigen Programmierwerkzeug. Während die objektorientierte Programmierung in Java und C# nach wie vor den zentralen Abstraktionsmechanismus darstellt, ist diese Art der Programmierung in C++ rückläufig. So werden tiefe Klassenhierarchien vermieden, und zu Gunsten der Effizienz und der Minimierung des Ressourcenverbrauchs verzichtet man in vielen Fällen auf Polymorphie, einen der fundamentalen Bestandteile der objektorientierten Programmierung.

Entstehung und Weiterentwicklung

[Bearbeiten | Quelltext bearbeiten]

Entstehungsgeschichte

[Bearbeiten | Quelltext bearbeiten]

Auf die Idee für eine neue Programmiersprache kam Stroustrup durch Erfahrungen mit der Programmiersprache Simula während seiner Doktorarbeit an der Cambridge University. Simula erschien zwar geeignet für den Einsatz in großen Software-Projekten, die Struktur der Sprache erschwerte aber die Erstellung hocheffizienter Programme. Demgegenüber ließen sich effiziente Programme zwar mit der Sprache BCPL schreiben, für große Projekte war BCPL aber wiederum ungeeignet.

Mit den Erfahrungen aus seiner Doktorarbeit erweiterte Stroustrup in den AT&T Bell Laboratories im Rahmen von Untersuchungen des Unix-Betriebssystemkerns in Bezug auf verteiltes Rechnen ab 1979 die Programmiersprache C. Die Wahl fiel auf die Programmiersprache C, da C eine Mehrzwecksprache war, die schnellen Code produzierte und einfach auf andere Plattformen zu portieren war. Als dem Betriebssystem Unix beiliegende Sprache hatte C außerdem eine erhebliche Verbreitung.

Eine der ersten Erweiterungen war ein Klassenkonzept mit Datenkapselung, für das die Sprache Simula-67 das primäre Vorbild war. Danach kamen abgeleitete Klassen hinzu, ein strengeres Typsystem, Inline-Funktionen und Standard-Argumente.

Während Stroustrup C with Classes („C mit Klassen“) entwickelte (woraus später C++ wurde), schrieb er auch cfront, einen Compiler, der aus C with Classes zunächst C-Code als Zwischenresultat erzeugte. Die erste kommerzielle Version von cfront erschien im Oktober 1985.

1983 wurde C with Classes in C++ umbenannt. Erweiterungen darin waren: Überladen von Funktionsnamen und Operatoren, virtuelle Funktionen, Referenzen, Konstanten, eine änderbare Freispeicherverwaltung und eine verbesserte Typüberprüfung. Die Möglichkeit von Kommentaren, die an das Zeilenende gebunden sind, wurde 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 Zugriffsmodells 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, Ausnahmebehandlung, 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 Hewlett-Packard entwickelten Standard Template Library (STL) hinzu.

Standardisierung

[Bearbeiten | Quelltext bearbeiten]

Nach jahrelanger Arbeit wurde schließlich 1998 die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt. Diese Version wurde im Nachhinein, als weitere Versionen der Sprache erschienen, auch C++98 genannt. Im Jahr 2003 wurde ISO/IEC 14882:2003 verabschiedet, eine Nachbesserung der Norm von 1998, in der einige Missverständnisse beseitigt und mehrere Details klarer formuliert wurden. Diese Version wird umgangssprachlich auch C++03 genannt.

Weiterentwicklung der Programmiersprache C++ nach 2005

[Bearbeiten | Quelltext bearbeiten]

Um mit den aktuellen Entwicklungen der sich schnell verändernden Computer-Technik Schritt zu halten, aber auch zur Ausbesserung bekannter Schwächen, erarbeitete das C++-Standardisierungskomitee die nächste größere Revision von C++, die inoffiziell mit C++0x abgekürzt wurde, worin die Ziffernfolge eine grobe Einschätzung des möglichen Erscheinungstermins andeuten sollte. Später, als ein Erscheinungstermin bis Ende 2009 nicht mehr zu halten war, änderte sich der inoffizielle Name zu C++1x.

Die vorrangigen Ziele für die Weiterentwicklung von C++ waren Verbesserungen im Hinblick auf die Systemprogrammierung sowie zur Erstellung von Programmbibliotheken. Außerdem sollte die Erlernbarkeit der Sprache für Anfänger verbessert werden.

Im November 2006 wurde der Zieltermin für die Fertigstellung auf das Jahr 2009 festgelegt. Im Juli 2009 wurde dieser Termin auf frühestens 2010 geändert. Im August 2011 wurde die Revision einstimmig von der ISO angenommen[25] und am 11. Oktober 2011 als ISO/IEC 14882:2011 offiziell veröffentlicht.[26][27] Inoffiziell heißt die Version C++11.

Verbesserungen am Sprachkern

[Bearbeiten | Quelltext bearbeiten]

C++98 deckte einige typische Problemfelder der Programmierung noch nicht ausreichend ab, zum Beispiel die Unterstützung von Nebenläufigkeit (Threads), deren Integration in C++, insbesondere für die Verwendung in Mehrprozessorumgebungen, eine Überarbeitung der Sprache unumgänglich machte. Durch die Einführung eines Speichermodells wurden Garantien der Sprache für den nebenläufigen Betrieb festgelegt, um Mehrdeutigkeiten in der Abarbeitungsreihenfolge sowohl aufzulösen als auch in bestimmten Fällen aufrechtzuerhalten und dadurch Spielraum für Optimierungen zu schaffen.

Zu den weitreichenderen Spracherweiterungen gehörte ferner die automatische Typableitung zur Ableitung von Ergebnistypen aus Ausdrücken und die sogenannten R-Wert-Referenzen, mit deren Hilfe sich als Ergänzung zu dem bereits vorhandenen Kopieren von Objekten dann auch ein Verschieben realisieren lässt, außerdem bereichsbasierte For-Schleifen (foreach) über Container und eingebaute Felder.[28]

Erweiterung der Programmbibliothek

[Bearbeiten | Quelltext bearbeiten]

Im April 2006 gab das C++-Standardisierungskomitee den sogenannten ersten Technischen Report (TR1) heraus, eine nicht normative Ergänzung zur aktuell gültigen, 1998 definierten Bibliothek, mit der Erweiterungsvorschläge vor einer möglichen Übernahme in die C++-Standardbibliothek auf ihre Praxistauglichkeit hin untersucht werden sollen. Viele Compiler-Hersteller lieferten den TR1 mit ihren Produkten aus.

Im TR1 waren u. a. reguläre Ausdrücke,[29] verschiedene intelligente Zeiger,[30] ungeordnete assoziative Container,[31] eine Zufallszahlenbibliothek,[32] Hilfsmittel für die C++-Metaprogrammierung, Tupel[33] sowie numerische und mathematische Bibliotheken enthalten.[34] Die meisten dieser Erweiterungen stammten aus der Boost-Bibliothek, woraus sie mit minimalen Änderungen übernommen wurden. Außerdem waren sämtliche Bibliothekserweiterungen der 1999 überarbeiteten Programmiersprache C (C99) in einer an C++ angepassten Form enthalten.[35]

Mit Ausnahme der numerischen und mathematischen Bibliotheken wurden alle TR1-Erweiterungen in die Sprachnorm C++11 übernommen. Ebenfalls wurde eine eigene Bibliothek zur Unterstützung von Threads eingeführt.

Mit der Norm ISO/IEC 14882:2011, auch bekannt als C++11, wurden viele weitreichende Neuerungen in C++ eingeführt, wie auszugsweise:

  • Lambdas (Anonyme Funktionen), welche vor der Verabschiedung des C++11-Standards in anderen Sprachen schon teils breite Anwendung fanden, erweitern die Sprache vor allem im Bereich der funktionalen Programmierung.
  • Eine erleichterte Typbehandlung mit Typinferenz ist nun über das Schlüsselwort auto (das nun nicht mehr ein Speicherklassen-Specifier ist) einerseits und das Schlüsselwort decltype (das den Typ eines Ausdrucks statisch zur Compilezeit zurückgibt, sofern ermittelbar) andererseits möglich. Beide Schlüsselworte zeigen ihre Stärke zudem auch im Verbund. So können ganze Funktionen, deren Rückgabetypen beispielsweise nur schwer vom Programmierer einzusehen sind, weil sie beispielsweise innerhalb komplexerer Klassentemplates liegen, komfortabel definiert werden:
    template <typename Factory>
    auto createObject(const Factory& creator) -> decltype(creator.makeObject()) {
        return creator.makeObject();
    }
    
  • Streng typisierte enums (enum class) beseitigen Probleme mit Namenskollisionen und schränken die Fehleranfälligkeit in Bezug auf implizite Typkonvertierungen ein.
  • Sogenannte „range-based loops“ mittels eines modifizierten for-Statements erleichtern die Arbeit mit Containern und Arrays in der Art, dass Iteratoren beim Traversieren von Objekten dieser Datentypen für viele Anwendungsfälle überflüssig werden:
    #include <iostream>
    #include <string>
    #include <vector>
    
    using namespace std;
    
    void printNames(const vector<string>& names) {
        for (const string& singleName: names)
            cout << singleName << endl;
    }
    
  • Es dürfen direkt aufeinanderfolgende spitze Klammern bei Templates benutzt werden: map<int, vector<int>>.
  • Überdies erfolgte mit der Einführung von variadischen (vielstelligen) Templates eine großräumige Erweiterung der Nutzungsmöglichkeiten von Templates. Diese ermöglichen nun eine nicht fixe Anzahl von Template-Argumenten template<typename... Values> class VariadicExampleClass;, was weitreichende Optionen und Vereinfachungen im Code- bzw. Algorithmenaufbau und der Codestruktur allgemein ermöglicht. Des Weiteren haben sie, wie viele andere C++11-Erweiterungen auch, das Potential, die Notwendigkeit zur Nutzung von teils fehleranfälligen und nicht robusten Macros weiter einzuschränken.
  • Die explizite Nutzbarkeit sogenannter Rvalue-Referenzen ermöglicht, aufbauend unter anderem auf sogenannter Bewegungssemantik, ein breites Spektrum von Codevereinfachungen, Laufzeitoptimierungen und ausnahmesicherer Programmierung. Mit den Rvalue-Referenzen wurden auch die sogenannten universellen Referenzen eingeführt, welche das Problem des „Perfect forwarding“ auf Sprachebene robust und einfach lösbar machen (die konsistente Weiterreichung von Typen innerhalb von Templatekonstrukten, die per „type deduction“ aufgelöst wurden, an weiterführende Templates). Vor der Verabschiedung des C++11-Standards war dies zumindest rein auf Sprachebene nicht möglich und erforderte vom Programmierer je nach Problemfall mehr oder weniger viel Eigenregie mit teils entsprechender Codeaufblähung und -Duplizierung.
  • Außerdem wurden einige Features aus C11 übernommen, zum Beispiel Ganzzahlen mit mindestens 64 Bit (long long) oder Zusicherungen zur Übersetzungszeit mittels static_assert (in C11: _Static_assert).[36]

Themen der Sprache C++, die Rechenzeit und Speicherplatz betreffen, wurden im sogenannten technical report ISO/IEC TR 18015:2006 behandelt.[37]

Zum Zeitpunkt der Einführung des Standards und auch noch vergleichsweise lange darüber hinaus unterstützten viele gängige Compiler diesen nicht vollständig bzw. mit Bezug auf einige Erweiterungen mitunter fehlerhaft. Besonders starke Einschränkungen zeigte diesbezüglich zum Beispiel Microsoft mit Visual C++ 2012. Mit Visual C++ 2015 sind mittlerweile jedoch nahezu alle wichtigen größeren Spracherweiterungen berücksichtigt worden.[38][39]

C++14, beschrieben im Standard ISO/IEC 14882:2014,[2] erweitert die Einsatzmöglichkeiten von auto und decltype, schwächt die Voraussetzungen für constexpr ab, erlaubt Variablen-Templates zu definieren (beispielsweise um mehrere Versionen von π mit je nach Typ unterschiedlicher Genauigkeit zu definieren), führt Binärliterale ein (0b...), führt Hochkommata als Trennzeichen in Zahlen ein, erlaubt generische Lambdas, erweitert Lambda capture expressions und führt das Attribut deprecated ein.[2]

Außerdem wurde die Standardbibliothek um ein paar Funktionen ergänzt, die bei C++11 „vergessen“ bzw. „übersehen“ wurden (z. B. std::make_unique) und etliche Funktionsdeklarationen nun als constexpr umdeklariert, was dem Compiler aggressivere Optimierungen gestattet.

Während der Entwicklungsphase wurde C++14 auch C++1y genannt, um anzudeuten, dass es die Nachfolgeversion der vormals als C++0x genannten Version sein wird.

Im März 2017 hat das ISO-C++-Komitee den Sprachstandard C++17 technisch abgeschlossen. Für die neue Fassung wurde unter anderem die Aufnahme des Typen std::byte beschlossen.[40] Dieser ist explizit für den byte-weisen Zugriff auf den Speicher bestimmt. Es wurden neue, generische Container eingeführt: std::any als Alternative zu void* mit Typüberprüfung zur Laufzeit, std::variant als Alternative zur aus C übernommenen Union mit Laufzeit-Typprüfung und std::optional, ein Container, der genau ein Element enthalten kann, aber nicht muss.

Bis zur offiziellen Verabschiedung wurde die Fassung auch als C++1z bezeichnet.[41]

Nach dem Sommer-Meeting Mitte Juli verriet der C++-Experte Herb Sutter, der für die Einberufung des Komitees verantwortlich ist, in seinem Blog[42] bereits erste Pläne für C++20.

Die finale Version von C++20 wurde im Dezember 2020 veröffentlicht, nachdem er im Februar finalisiert und im September bestätigt wurde.[43]

  • Concepts als Erweiterung zu Templates
  • bestimmte Initialisierer (zuerst in C99)
  • [=, this] in Lambdas
  • Template-Parameter-Listen in Parametern
  • Dreiwegevergleich mit dem „spaceship operator“, operator <=>
  • Koroutinen
  • ein Modulsystem zur Codekapselung und kürzeren Kompilierzeiten[44]
  • std::format zur String-Interpolation. Es handelt sich um typsicheren und durch den Benutzer erweiterbaren Ersatz für sprintf und stringstreams, der sich stark an Python anlehnt.
  • std::span als Verallgemeinerung des Konzeptes von string_view (C++17). Ein span beschreibt einen Speicherbereich durch einen Pointer und eine Größenangabe.
  • Reflection
  • Executors
  • Pattern Matching
  • Networking[45]

Der Name „C++“

[Bearbeiten | Quelltext bearbeiten]

Der Name C++ ist eine Wortschöpfung von Rick Mascitti, einem Mitarbeiter Stroustrups, und wurde zum ersten Mal im Dezember 1983 benutzt. Der Name kommt von der Verbindung der Vorgängersprache C und dem Inkrement-Operator ++, der den Wert einer Variablen inkrementiert (um eins erhöht). Der Erfinder von C++, Bjarne Stroustrup, nannte C++ zunächst „C mit Klassen“ (C with classes).[46]

Oft geäußerte Kritik an der Sprache umfasst beispielsweise:

  • C++ sei sehr komplex und fehleranfällig zu programmieren. Man müsse viel lernen und üben, um es gut zu beherrschen, und viele Features gelten als äußerst komplex.[47]
  • C++ sei zu low-level-mäßig aufgebaut; während es viele Features von höher abstrahierenden Sprachen aufweist (Klassen, generische Klassen/Funktionen etc.), seien als wichtig empfundene Dinge, insbesondere Garbage Collection, nicht vorhanden.[8]
  • C++ gilt zwar als schnell, beispielsweise wegen der Möglichkeit, frei mit Pointern zu arbeiten, doch diese Leistung sei auf den heutigen, schnellen Computersystemen nur in Ausnahmefällen nötig: Während es sinnvoll sei, Betriebssysteme o. Ä. in C++ zu schreiben, sei es softwaretechnisch viel günstiger, Anwendungsprogramme in höheren Sprachen zu schreiben, da diese leichter zu warten seien und immer noch eine ausreichende Leistung aufwiesen.[48]
  • Typisch in Verbindung mit C++ ist das Zitat von Bjarne Stroustrup:

“In C++ it’s harder to shoot yourself in the foot, but when you do, you blow off your whole leg.”

„In C++ ist es schwieriger, sich selbst in den Fuß zu schießen, aber wenn man es tut, dann ist gleich das ganze Bein weg.“[49]

Soll heißen: C++ erleichtert zunächst vieles, aber es bringt gleichzeitig viele Mittel mit sich, die mit Bedacht eingesetzt werden müssen. Zum Beispiel können durch die dynamische Speicherallokation ohne automatische Speicherfreigabe Speicherlecks entstehen. Zeiger können auf falsche Speicherbereiche verweisen und verstecktes Fehlverhalten erzeugen (Hängender Zeiger).
  • Bjarne Stroustrup: Die C++-Programmiersprache: Aktuell zu C++11. Carl Hanser, 2015, ISBN 978-3-446-43961-0 (Standardwerk zu C++, Grundkenntnisse in C von Vorteil).
  • Bjarne Stroustrup: The Design and Evolution of C++. Addison-Wesley, 1994, ISBN 0-201-54330-3 (Buch beschreibt die Entwicklung und das Design von C++; vom Sprachdesigner geschrieben).
  • Bjarne Stroustrup: Programming – Principles and Practice Using C++. 3. überarbeitete Auflage. Addison-Wesley, 2024, ISBN 978-0-13-830868-1 (Einführung in die Programmierung; Standardwerk für Einstiegsprogrammierkurse an der Universität Texas A&M).
  • Herb Sutter: Exceptional C++. 1. Auflage. Addison-Wesley, 2000, ISBN 3-8273-1711-8 (Vertiefung vorhandener C++-Kenntnisse.).
  • Andrei Alexandrescu: Modernes C++ Design – Generische Programmierung und Entwurfsmuster angewendet. 1. Auflage. Mitp-Verlag, 2003, ISBN 3-8266-1347-3 (Ein Standardwerk zur C++-Metaprogrammierung, setzt ein tiefes Verständnis von C++ voraus.).
  • Ulrich Breymann: C++ programmieren: C++ lernen – professionell anwenden – Lösungen nutzen. 7. überarbeitete Auflage. Carl Hanser, 2023, ISBN 978-3-446-47689-9 (C++-Einführung aus dem Hochschulumfeld).
  • Sibylle Schupp: A Semantic Definition of Separate Type Checking in C++ with Concepts. (wissenschaftlicher Artikel). In: Journal of Object Technology. Band 8, Nr. 5, 2009, S. 105–132, doi:10.5381/jot.2009.8.5.a2.
Wikibooks: C++-Programmierung – Lern- und Lehrmaterialien
Wiktionary: C++ – Bedeutungserklärungen, Wortherkunft, Synonyme, Übersetzungen

Einzelnachweise

[Bearbeiten | Quelltext bearbeiten]
  1. ISO/IEC 14882:2024 - Programming languages — C++. 19. Oktober 2024.
  2. a b c ISO/IEC 14882:2014 – Information technology -- Programming languages -- C++. In: www.iso.org. Dezember 2014, abgerufen am 22. September 2018.
  3. ISO/IEC 14882:2017 – Programming languages -- C++. In: www.iso.org. Dezember 2017, abgerufen am 22. September 2018.
  4. ISO/IEC 14882:2020 - Programming languages -- C++. Dezember 2020, abgerufen am 21. Oktober 2021.
  5. ISO/IEC 14882:2024 - Programming languages -- C++. Oktober 2024, abgerufen am 9. Februar 2025.
  6. 9. Classes — Python 3.6.4 documentation. In: docs.python.org. Abgerufen am 17. Mai 2018.
  7. The Programming Languages Beacon. In: lextrait.com. Abgerufen am 21. Januar 2018 (englisch).
  8. a b Bjarne Stroustrup: Proposal to Acknowledge that Garbage Collection for C++ is Possible. (PDF) 1996, abgerufen am 6. Juni 2015 (englisch): „The most loudly proclaimed fundamental weakness of C++ these days is the absence of automatic garbage collection. This criticism is harming C++’s reputation, scaring potential users away, and restricting the range of applications for which C++ is a strong contender as an implementation language. For many applications automatic garbage collection is indeed a very powerful tool and the right tool for the job.“
  9. Hans-J. Boehm, Mike Spertus, Clark Nelson: N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised). In: open-std.org. 13. Juni 2008, abgerufen am 21. Januar 2018 (englisch).
  10. Transparent Programmer-Directed Garbage Collection for C++ (PDF; 156 kB).
  11. P2186R2: Removing Garbage Collection Support. Abgerufen am 9. Februar 2025.
  12. C++23 - cppreference.com. Abgerufen am 9. Februar 2025.
  13. Bjarne Stroustrup: C++-FAQ über Speicherlecks (englisch); abgerufen am 3. Mai 2013.
  14. std::shared_ptr auf cppreference.com, Abschnitt Hinweise zur Umsetzung; abgerufen am 5. Juni 2020
  15. Das d-Zeiger-Idiom. auf heise Developer.
  16. Undefiniertes Verhalten bei mehrfacher Zuweisung. (Memento vom 22. August 2014 im Internet Archive), abgerufen am 20. August 2014.
  17. Scott Meyers: Effektiv C++ Programmieren. Addison-Wesley, S. 22/23, 43/44 und 46, nach Google-Books, abgerufen am 20. August 2014.
  18. Myths and Missconceptions about C++, Abschnitt Undefined Behavior, abgerufen am 20. Februar 2015 (englisch).
  19. Bjarne Stroustrup's C++ Style and Technique FAQ. In: www.stroustrup.com. 30. September 2017, abgerufen am 22. September 2018 (englisch).
  20. Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991–2006. (PDF; 690 kB).
  21. Clang: a C language family frontend for LLVM. In: clang.llvm.org. Abgerufen am 22. September 2018 (englisch).
  22. Oracle Developer Studio. In: www.oracle.com. Abgerufen am 22. September 2018 (englisch).
  23. Turbo C++ Community. In: www.turboexplorer.com. Abgerufen am 22. September 2018 (englisch).
  24. Java – A Bit of History oder Peter Drayton, Ted Neward, Ben Albahari: C# in a Nutshell: A Desktop Quick Reference. 2. Auflage. O’Reilly, 2003, ISBN 978-0-596-00526-9.
  25. C++11 einstimmig als Standard angenommen. auf Heise online, 13. August 2011.
  26. Neue C++-Version als ISO/IEC-Standard veröffentlicht. Heise online, 11. Oktober 2011.
  27. Programmiersprache: ISO veröffentlicht C++11. Golem.de, 11. Oktober 2011.
  28. C++11 – the new ISO C++ standard. In: www.stroustrup.com. Abgerufen am 22. September 2018 (englisch).
  29. A Proposal to add Regular Expressions to the Standard Library. bei Open Standards. 3. März 2003 (englisch).
  30. A Proposal to Add General Purpose Smart Pointers to the Library Technical Report. bei Open Standards. 27. März 2003 (englisch)
  31. A Proposal to Add Hash Tables to the Standard Library. bei Open Standards. 9. April 2003 (englisch).
  32. A Proposal to Add an Extensible Random Number Facility to the Standard Library. bei Open Standards. 10. April 2003 (englisch).
  33. Proposal for adding tuple types into the standard library. (PDF; 164 kB) bei Open Standards. 8. November 2002 (englisch).
  34. A Proposal to Add Mathematical Special Functions to the C++ Standard Library. bei Open Standards. 24. Februar 2003 (englisch).
  35. ISO/IEC JTC1/SC22/WG21 N1568. bei Open Standards, von 2004 (englisch).
  36. B. Stroustrup: C++11 FAQ
  37. ISO Technical Report on C++ Performance (PDF; 1,2 MB)
  38. MSDN: Unterstützung für C++11/14/17-Funktionen (Modern C++) Unterstützung von C++11/14/17-Features durch Microsoft-Compiler
  39. The GNU Compiler Collection: Status of Experimental C++11 Support in GCC 4.7 Unterstützung von C++11-Features durch den gcc
  40. Programmiersprachen: C++17 ist technisch fertig. heise.de, abgerufen am 17. Juli 2017.
  41. C++ Support in Clang. C++17 implementation status. In: clang.llvm.org. 22. September 2018, abgerufen am 22. September 2018 (englisch).
  42. Trip report: Summer ISO C++ standards meeting (Toronto). herbsutter.com, abgerufen am 17. Juli 2017 (englisch).
  43. ISO/IEC 14882:2020. In: iso.org. Abgerufen am 31. Januar 2022 (englisch).
  44. C++ Modules Might Be Dead-on-Arrival. In: vector-of-bool.github.io. Abgerufen am 21. Mai 2019 (englisch).
  45. r/cpp – 2019-02 Kona ISO C++ Committee Trip Report (C++20 design is complete; Modules in C++20; Coroutines in C++20; Reflection TS v1 published; work begins on a C++ Ecosystem Technical Report). Abgerufen am 22. August 2019 (englisch).
  46. When was C++ invented? (Memento vom 26. September 2011 im Internet Archive) (englisch) – FAQ-Eintrag bei AT&T Labs Research; Stand: 4. Juli 2011.
  47. Ian Joyner: C++?? A Critique of C++. (PDF) November 1992, S. 27–29, abgerufen am 6. Juni 2015 (englisch).
  48. The Problem With C++. In: www.codinghorror.com. 12. Januar 2007, archiviert vom Original (nicht mehr online verfügbar) am 26. Februar 2014; abgerufen am 22. September 2018 (englisch).  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/www.codinghorror.com
  49. Bjarne Stroustrup's FAQ. Did you really say that? In: www.stroustrup.com. 18. März 2018, abgerufen am 22. September 2018 (englisch).