„C++“ – Versionsunterschied

[gesichtete Version][gesichtete Version]
Inhalt gelöscht Inhalt hinzugefügt
Keine Bearbeitungszusammenfassung
K unstrittige aenderungen von 190.193.138.37, Caligulaminus und Trustable wiederhergestellt. nicht, dass die spaeter verloren gehen.
(87 dazwischenliegende Versionen von 17 Benutzern werden nicht angezeigt)
Zeile 1:Zeile 1:
{{Infobox Programmiersprache
{{Infobox Programmiersprache
| Name = C++
| Name = C++
| Typisierung = [[Statische Typisierung|statisch]], [[schwache Typisierung|schwach]], [[Typsicherheit|unsicher]]
| Paradigma = Multiparadigmen ([[Funktionale Programmierung|funktional]], [[Generische Programmierung|generisch]], [[Imperative Programmierung|imperativ]], [[Objektorientierte Programmierung|objektorientiert]], [[Prozedurale Programmierung|prozedural]], [[Strukturierte Programmierung|strukturiert]])
| Erscheinungsjahr = 1979
| Entwickler = [[Bjarne Stroustrup]]
| Typisierung = [[Statische Typisierung|statisch (dynamische Typprüfung möglich)]], explizit, [[Typisierung (Informatik)|stark]]
| Implementierung = [[C++ Builder]],<br /> [[GNU Compiler Collection|GCC]],<br /> [[Microsoft Visual C++|MS Visual C++]],<br /> [[Intel C++ Compiler]],<br /> [[Clang|Clang/LLVM]]
| Standardisierungen = ISO/IEC 14882:1998,<br/>ISO/IEC 14882:2003,<br/>ISO/IEC TR 19768:2007,<br/>ISO/IEC 14882:2011
| Standardisierungen = ISO/IEC 14882:1998,<br/>ISO/IEC 14882:2003,<br/>ISO/IEC TR 19768:2007,<br/>ISO/IEC 14882:2011
| Beeinflusst_von = [[C (Programmiersprache)|C]], [[Simula]], [[Ada (Programmiersprache)|Ada]], [[ALGOL|ALGOL 68]], [[CLU (Programmiersprache)|CLU]], [[ML (Programmiersprache)|ML]]
| Beeinflusste = [[C-Sharp|C#]], [[Java (Programmiersprache)|Java]], [[PHP]], [[Perl (Programmiersprache)|Perl]], [[D (Programmiersprache)|D]], [[Go (Programmiersprache)|Go]], [[Vala (Programmiersprache)|Vala]]
}}
}}


'''C++''' ist eine von der [[Internationale Organisation für Normung|ISO]] standardisierte [[höhere Programmiersprache]]. Sie wurde ab 1979 von [[Bjarne Stroustrup]] bei [[AT&T]] als Erweiterung der [[C (Programmiersprache)|Programmiersprache C]] entwickelt. C++ wurde als Mehrzwecksprache konzipiert und unterstützt mehrere [[Programmierparadigma|Programmierparadigmen]], wie die [[Objektorientierte Programmierung|objektorientierte]], [[Generische Programmierung|generische]] und [[prozedurale Programmierung]]. C++ ermöglicht sowohl die [[Effizienz (Informatik)|effiziente]] und maschinennahe Programmierung als auch eine Programmierung auf hohem Abstraktionsniveau.
'''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.


== Anwendungsgebiete ==
== Einsatzgebiete ==
C++ wird sowohl in der [[Systemprogrammierung]] als auch in der [[Anwendungsprogramm]]ierung eingesetzt und gehört in beiden Bereichen zu den verbreitetsten Programmiersprachen.<ref>[http://www.lextrait.com/vincent/implementations.html The Programming Languages Beacon]</ref>


=== Systemprogrammierung ===
C++ wird sowohl in der [[Systemprogrammierung]] als auch in der [[Anwendungsprogramm]]ierung eingesetzt. Typische Anwendungsfelder in der Systemprogrammierung sind [[Betriebssystem]]e, [[Eingebettetes System|eingebettete Systeme]], [[virtuelle Maschine]]n, [[Treiber (Software)|Treiber]] und [[Digitale Signalverarbeitung|Signalprozessoren]]. C++ nimmt hier oft den Platz ein, der früher ausschließlich [[Assemblersprachen]] und der Programmiersprache [[C (Programmiersprache)|C]] vorbehalten war. Aus der Domäne der Anwendungsprogrammierung wurde C++ mit dem Aufkommen der Sprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] zum Teil zurückgedrängt.
Typische Anwendungsfelder in der Systemprogrammierung sind [[Betriebssystem]]e, [[Eingebettetes System|eingebettete Systeme]], [[virtuelle Maschine]]n, [[Treiber (Software)|Treiber]] und [[Digitaler Signalprozessor|Signalprozessor]]en. C++ nimmt hier oft den Platz ein, der früher ausschließlich [[Assemblersprache]]n und der Programmiersprache [[C (Programmiersprache)|C]] vorbehalten war.

=== Anwendungsprogrammierung ===
Bei der Anwendungsprogrammierung kommt C++ vor allem dort zum Einsatz, wo maximale Forderungen an die Effizienz gestellt werden, um durch technische Rahmenbedingungen vorgegebene Leistungsgrenzen möglichst gut auszunutzen. In den Jahren 2000 bis etwa 2010 wurde C++ aus der Domäne der Anwendungsprogrammierung zum Teil von den Sprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] zurückgedrängt. Danach gewann C++ mit dem Aufkommen mobiler Geräte aufgrund Ressourcen-sparender sowie effizienterer und dadurch stromsparenderer Applikationen wieder Marktanteile in der Applikationsprogrammierung zurück.


== Eigenschaften ==
== Eigenschaften ==
Zeile 23:Zeile 22:
Die Sprache C++ legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken und favorisiert dadurch verallgemeinerte Mechanismen gegenüber in die Sprache integrierten Einzellösungen für typische Problemstellungen.
Die Sprache C++ legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken und favorisiert dadurch verallgemeinerte Mechanismen gegenüber in die Sprache integrierten Einzellösungen für typische Problemstellungen.


Eine der Stärken von C++ ist auch 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.
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.

==== Kritik am Sprachdesign ====
Trotz (oder gerade wegen) der starken Verbreitung von C++ gibt es Kritiken am Design der Sprache. Einige der problematischen Konzepte<ref>[http://yosefk.com/c++fqa/ frequently questioned answers] (englisch) - Kommentare zur C++ FAQ abgerufen am 13. März 2012</ref> sind:

; manuelle Speicherverwaltung
:C++ vertraut darauf, dass der Anwender (Programmierer) die Verwaltung des Arbeitsspeichers übernimmt. Die Sprache selbst gibt keinerlei Hilfestellung um zu ermitteln, ob ein bestimmter Speicherbereich noch (von anderen Programmteilen) verwendet wird oder nicht.

; unvollständige Objektorientierung
:In C++ gehören private Eigenschaften (Variablen und Methoden) immer mit zum in der Header-Datei veröffentlichten Interface. Dadurch entsteht eine unnötig enge Kopplung der Objekte zu den Code-Stellen, die sie verwenden. Zur Laufzeit sind die Speicherbereiche der einzelnen Objekte nicht vor (absichtlichen oder versehentlichen) gegenseitigen Änderungen geschützt.

; kontextabhängige Bedeutung von Sprachelementen/Operator Overloading : Die Bedeutung einiger Sprachelemente insbesondere von Operatoren (wie zB. << ) kann nur aus dem Gesamtkontext der Anwendung erkannt werden. Daher benötigen C++-Compiler sehr viel Speicher und Zeit für die Übersetzung der Programmquelltexte. Hinzu kommt, dass Operatoren in unterschiedlichen Komponenten mit unterschiedlicher Bedeutung überladen werden können, was zur Laufzeit des Gesamtprogramms zu Problemen führen kann.


=== Kompatibilität mit C ===
=== Kompatibilität mit C ===

==== C89 / C++90 ====


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.
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.


Die Kompatibilität mit C zwingt C++ aber auch 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-->. Plattformabhängigkeiten erschweren die Portierung von C++-Programmen zwischen unterschiedlichen Rechnertypen, Betriebssystemen und Compilern.
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.


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.
Einige Sprachfeatures, die in der C90-Norm als ''veraltet'' (engl. ''deprecated'') ̣– aber noch erlaubt – gekennzeichnet waren (z.&thinsp;B. das „implizite int“, implizite [[Typumwandlung]] von <code>void</code>-Zeigern), wurden in C++ nicht übernommen. Auch ist die Semantik einiger weniger Ausdrücke in C++ eine andere als in C. Dies führt dazu, dass C keine „Teilmenge“ von C++ ist und viele C-Programme sich nicht mit einem C++-Compiler übersetzen lassen.


Die letzten Änderungen an C fanden im Jahr 1999 statt ([[ISO/IEC 9899:1999]], auch kurz C99 genannt), also nach der Normung von C++, 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.
==== Spätere Neuerungen an C und C++ ====

Die letzten Änderungen an C fanden im Jahr 1999 statt ([[ISO/IEC 9899:1999]], auch kurz C99 genannt), also nach der Normung von C++, so dass dort eingeflossene Änderungen nicht in C++ berücksichtigt werden konnten. Nicht alle Neuerungen von C99 flossen in die neue C++-Sprachnorm von 2011 ein, da sie entweder inkompatibel zu existierendem C++-Code gewesen wären (z.&thinsp;B. das Schlüsselwort <code>restricted</code>) oder Features betreffen, die in C++ bereits auf eigene Art und Weise implementiert worden sind (z.&thinsp;B. komplexe Zahlen).


=== Sprachmerkmale im Detail ===
=== Sprachmerkmale im Detail ===


C++ basiert auf der [[C (Programmiersprache)|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 Typenumwandlungsmöglichkeiten, [[Klasse (objektorientierte Programmierung)|Klassen]] mit [[Mehrfachvererbung]] und [[Virtuelle Funktion|virtuellen Funktionen]], [[Ausnahmebehandlung]], [[Template (Programmierung)|Templates]] (Schablonen), [[Namensraum|Namensräume]], [[Inline-Ersetzung|Inline-Funktionen]], [[Überladen]] von [[Operator (Mathematik)|Operatoren]] und Funktionsnamen, [[Referenz (Programmierung)|Referenzen]], Operatoren zur [[Dynamischer Speicher|Freispeicherverwaltung]] und mit der [[C++-Standardbibliothek]] eine erweiterte [[Bibliothek (Programmierung)|Bibliothek]].
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 (objektorientierte Programmierung)|Klassen]] mit [[Mehrfachvererbung]] und [[Virtuelle Funktion|virtuellen Funktionen]], [[Ausnahmebehandlung]], [[Template (Programmierung)|Templates]] (Schablonen), [[Namensraum|Namensräumen]], [[Inline-Ersetzung|Inline-Funktionen]], [[Überladen]] von [[Operator (Mathematik)|Operatoren]] und Funktionsnamen, [[Referenz (Programmierung)|Referenzen]], Operatoren zur [[Dynamischer Speicher|Freispeicherverwaltung]] und mit der [[C++-Standardbibliothek]] eine erweiterte [[Bibliothek (Programmierung)|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">[http://www.research.att.com/~bs/hopl-almost-final.pdf research.att.com]</ref>


C++ ist eine sogenannte „Multiparadigmen-Sprache“, die verschiedene Programmiertechniken unterstützt:
C++ ist eine sogenannte „Multiparadigmen-Sprache“, die verschiedene Programmiertechniken unterstützt:
Zeile 62:Zeile 48:
* [[Generische Programmierung]] mittels [[Template (Programmierung)|Templates]].
* [[Generische Programmierung]] mittels [[Template (Programmierung)|Templates]].


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

=== Hallo-Welt-Programm in C++ ===


Der folgende [[Quelltext]] stellt ein einfaches C++-[[Computerprogramm|Programm]] dar, das die Meldung [[Hallo-Welt-Programm|„''Hallo Welt!''“]] auf dem Standardausgabemedium ausgibt:
Der folgende [[Quelltext]] stellt ein einfaches C++-[[Computerprogramm|Programm]] dar, das die Meldung [[Hallo-Welt-Programm|„''Hallo Welt!''“]] auf dem Standardausgabemedium ausgibt:
Zeile 74:Zeile 59:
Änderungen bitte zuerst auf der Diskussionsseite absprechen!
Änderungen bitte zuerst auf der Diskussionsseite absprechen!
Nicht abgesprochene Änderungen werden umgehend zurückgesetzt.
Nicht abgesprochene Änderungen werden umgehend zurückgesetzt.
<ostream> wird hier benötigt! Siehe Diskussionsseite.
Siehe Diskussionsseite.
Es gilt auch als schlechter Stil, den std-Namensraum ohne Not in den globalen Namensraum zu klatschen. Daher wird das im Beispiel nicht getan.
-->
-->
<syntaxhighlight lang="cpp">
<syntaxhighlight lang="cpp">
Zeile 81:Zeile 65:
#include <ostream> // Ab C++11 nicht mehr nötig
#include <ostream> // Ab C++11 nicht mehr nötig


int main()
int main()
{
{
std::cout << "Hallo Welt!" << std::endl;
std::cout << "Hallo Welt!" << std::endl;
}
}
</syntaxhighlight><!-- Nicht abgesprochene Änderungen werden umgehend zurück gesetzt. -->
</syntaxhighlight><!-- Nicht abgesprochene Änderungen werden umgehend zurück gesetzt. -->
''Erläuterungen:'' Bei <tt>main</tt> handelt es sich um die Haupt-[[Funktion (Programmierung)|Funktion]]. Sie ist in jedem C++-Programm vorhanden und dient als Einstiegspunkt des Programms. Die Funktion <tt>main</tt> ist die einzige Funktion, die – obwohl sie einen Wert zurückgibt – nicht die Anweisung „<tt>return</tt>“ benötigt. Ohne die explizite Anweisung <tt>return</tt> gibt <tt>main</tt> den Wert 0 zurück.<tt>cout</tt> ist eine Instanz der <tt>ostream</tt>-Klasse, die sich im "<tt>std</tt>" Namensraum befindet und durch den Scope-Operator (<tt>::</tt>) angesprochen wird. <tt>cout</tt> wird durch den Header <tt><iostream></tt> deklariert und in <tt><ostream></tt> definiert: er wird auf den Ausgabestream [[Standard-Datenströme|<tt>stdout</tt>]] (aus <tt><cstdio></tt>, bzw. <tt><stdio.h></tt>: Ein Zeiger auf eine FILE-Struktur Instanz) gekoppelt). Der sogenannte Shift-Operator kann, zusammen mit dem Großteil aller anderen Operatoren, in/für Klassen auf mehrere Weisen [[Überladen]] werden. Die „Ausgabe“ des Kontroll-Objekts <tt>std::endl</tt> erzeugt einen Zeilenumbruch. Die bereits oben angesprochene [[Header-Datei]] <tt><ostream></tt>, welche durch den [[Präprozessor]] eingefügt wird, sollte hier eingebunden werden, da der Standard nicht verlangt, dass <tt><iostream></tt> diese Header-Datei einbindet;
''Erläuterungen:'' Bei <tt>main</tt> handelt es sich um die Haupt-[[Funktion (Programmierung)|Funktion]]. Sie ist in jedem C++-Programm vorhanden und dient als Einstiegspunkt des Programms. Die Funktion <tt>main</tt> ist die einzige Funktion, die – obwohl sie einen Wert zurückgibt – nicht die Anweisung „<tt>return</tt>“ benötigt. Ohne die explizite Anweisung <tt>return</tt> gibt <tt>main</tt> den Wert 0 zurück.

Im neuen C++11-Standard allerdings wird die Inkludierung von <tt><ostream></tt> durch die Inkludierung von <tt><iostream></tt> garantiert <ref>[http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2011/n3242.pdf Standard iostream objects: Header <iostream> synopsis] (englisch) Working Draft, Standard for Programming Language C++ | Siehe 27.4: Standard iostream objects</ref>. In den meisten früheren Implementierungen (C++03/98 konforme Compiler) reicht es allerdings auch aus, nur <tt><iostream></tt> einzubinden.<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2186.html Some Small Additions to iostream] (englisch) – Webdokument bei ''Open Standards'', vom 6.&nbsp;März 2007</ref>
<tt>cout</tt> ist eine Variable vom Typ der <tt>ostream</tt>-Klasse, die sich im Namensraum „<tt>std</tt>“ befindet und durch den Bereichsoperator (<tt>::</tt>) angesprochen wird. <tt>cout</tt> wird in der [[Header-Datei]] <tt><iostream></tt> deklariert und in <tt><ostream></tt> definiert: Sie wird auf den [[Standard-Datenströme|Ausgabedatenstrom]] <tt>stdout</tt> gelenkt.

<tt>std::endl</tt> erzeugt einen Zeilenumbruch.

Der Operator <tt>&lt;&lt;</tt> verknüpft die Ausgaben miteinander.


== Umsetzung ==
== Umsetzung ==
Zeile 93:Zeile 82:
=== C++-Compiler ===
=== C++-Compiler ===


Die Implementierung eines C++-[[Compiler]]s gilt als aufwändig, da es in der Sprachdefinition sehr viele Mehrdeutigkeiten und Ungenauigkeiten gibt (z.B. haben die Zeichen < > viele Bedeutungen: als Vergleichsoperator, als template-Klammern in der Definition, als template-Klammern im Aufruf von Funktionstemplates, als template-Klammern in der Instantiierung, als Shift-Operator etc.).
Die Implementierung eines C++-[[Compiler]]s gilt als aufwändig. Seit der Fertigstellung der Sprachnorm 1998 dauerte es mehrere Jahre, bis die Sprache von C++-Compilern weitestgehend unterstützt wurde.

Seit der Fertigstellung der Sprachnorm 1998 dauerte es mehrere Jahre, bis die Sprache von C++-Compilern weitestgehend unterstützt wurde.


Zu den bedeutendsten C++-Compilern gehören:
Zu den verbreitetsten C++-Compilern gehören:
* Der [[GNU Compiler Collection|g++]] ist die C++-Ausprägung der GNU Compiler Collection (GCC); g++ ist quelloffen, frei verfügbar. Der g++ unterstützt viele Betriebssysteme (darunter Unix, Linux, Mac&nbsp;OS&nbsp;X, [[Microsoft Windows|Windows]] und AmigaOS) und Prozessorplattformen. Derzeit dient eine Sonderanfertigung des Compilers namens ConceptGCC als Prüfmittel für verschiedene geplante C++-Spracherweiterungen. ''GNU C++'' existiert seit 1987 und ist somit einer der ältesten C++-Compiler.<ref name="hopIII">[http://www.cs.tamu.edu/news/items?id=1797 Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006]</ref>
* Der in [[Microsoft Visual C++]] enthaltene Compiler ist einer der verbreitetsten für das Betriebssystem Windows.
* Der in [[Microsoft Visual C++]] enthaltene Compiler ist einer der verbreitetsten für das Betriebssystem Windows.
* Der [[Comeau C++]] ist derzeit der einzige Compiler, der <tt>export</tt> von Templates integriert hat und damit der einzige, der alle C++-Sprachmittel enthält. Das sogenannte „Front-End“ des Compilers, also der Teil, der die Analyse-Phase implementiert, wurde von der Firma ''Edison Design Group'' (EDG) erstellt, 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.
* 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) erstellt, 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.
* Der [[Intel C++ Compiler]] verwendet ebenfalls das 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&nbsp;X. Da die mit dem ''Intel C++ Compiler'' erzeugten Programme den Befehlssatz der Intel-Prozessoren besonders gut ausnutzen, erzeugen sie besonders effiziente Programme für Intel-Prozessoren.
* Der [[Intel C++ Compiler]] verwendet ebenfalls das 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&nbsp;X. Da die mit dem ''Intel C++ Compiler'' erzeugten Programme den Befehlssatz der Intel-Prozessoren besonders gut ausnutzen, erzeugen sie besonders effiziente Programme für Intel-Prozessoren.
* [[Clang]], ein Frontend für die von Apple geförderte plattformübergreifende Compilerinfrastruktur [[LLVM]], die unter anderem auch in der integrierten Entwicklungsumgebung [[Xcode]] verwendet wird. <ref>[http://clang.llvm.org/ clang.llvm.org]</ref>
* Der [[Borland]] [[C++ Builder]] ist ein im Developer Studio enthaltener C++-Compiler.
* Der [[GNU Compiler Collection|g++]] ist die C++-Ausprägung der GNU Compiler Collection (GCC); g++ ist quelloffen und frei verfügbar. Der g++ unterstützt viele Betriebssysteme (darunter Unix, Linux, Mac&nbsp;OS&nbsp;X, [[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.cs.tamu.edu/news/items?id=1797 ''Evolving a language in and for the real world: C++ 1991-2006.'']</ref>
* [[Clang]](++), ein Frontend für die von Apple geförderte plattformübergreifende Compilerinfrastruktur [[LLVM]], die unter anderem auch in [[Xcode]] verwendet wird. <ref>http://clang.llvm.org/</ref>


=== C++-Programmierung ===
=== C++-Programmierung ===
Das breite Leistungsspektrum und die vielfältigen Gestaltungsmöglichkeiten der Sprache sowie die sehr umfassenden Bibliotheken (Streams, STL) führen zu verhältnismäßig langen Einarbeitungszeiten. Besonders im Vergleich zu C bietet C++ eine enorme Fülle an Sprachmitteln (z.B. Schlüsselwörter etc.), aber auch Inkonsistenzen innerhalb der Sprache, die das Erlernen erschweren und bei Anfängern für Verwirrung sorgen. Aufgrund der Ähnlichkeit zu C neigen insbesondere Programmierer, die sehr erfahren im Schreiben von C-Code sind, ihre bisherigen Kenntnisse weiter zu verwenden, somit die Objektorientierung verletzen und unschönen C++-Code produzieren.
Das breite Leistungsspektrum und die vielfältigen Gestaltungsmöglichkeiten der Sprache sowie die Bibliotheken führen zu verhältnismäßig langen Einarbeitungszeiten. Im Vergleich mit C bietet C++ eine enorme Fülle an Sprachmitteln.


== Vergleich mit anderen Sprachen ==
== Vergleich mit anderen Sprachen ==

=== Objective-C ===
=== 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++ an [[Smalltalk (Programmiersprache)|Smalltalk]] und nicht an [[Simula]] orientierte. Die Syntax von Objective-C unterscheidet sich unter anderem wegen der Smalltalk-Wurzeln stark von C++. Objective-C ist deutlich weniger weit verbreitet<!-- genauer! --> als C++. Wichtigstes Einsatzgebiet von Objective-C ist die Programmierung unter den Betriebssystemen [[Apple iOS]] und [[Mac OS X]] sowie unter der Programmierschnittstelle [[OpenStep]].
C++ war nicht der einzige Ansatz, die Programmiersprache C um Eigenschaften zu erweitern, die das objektorientierte Programmieren vereinfachen. In den 1980er Jahren entstand die Programmiersprache [[Objective-C]], die sich aber im Gegensatz zu C++ an [[Smalltalk (Programmiersprache)|Smalltalk]] und nicht an [[Simula]] orientierte. Die Syntax von Objective-C unterscheidet sich unter anderem wegen der Smalltalk-Wurzeln stark von C++. Objective-C ist deutlich weniger weit verbreitet<!-- genauer! --> als C++. Wichtigstes Einsatzgebiet von Objective-C ist die Programmierung unter den Betriebssystemen [[Apple iOS]] und [[Mac OS X]] sowie unter der Programmierschnittstelle [[OpenStep]].


=== Java und C# ===
=== Java und C# ===
Die Programmiersprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] verfügen über eine ähnliche, ebenfalls an C angelehnte Syntax wie C++,<ref>[http://docs.oracle.com/javase/specs/jvms/se5.0/html/Introduction.doc.html#4560 Java – A Bit of History] oder {{Literatur |Autor=Peter Drayton, Ted Neward, Ben Albahari |Titel=C# in a Nutshell: A Desktop Quick Reference |Verlag=O'Reilly |Jahr=2003 |ISBN=978-0-5960-0526-9 |Auflage=2.}}</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.
Die Programmiersprachen [[Java (Programmiersprache)|Java]] und [[C-Sharp|C#]] verfügen über eine ähnliche, ebenfalls an C angelehnte Syntax wie C++,<ref>[http://docs.oracle.com/javase/specs/jvms/se5.0/html/Introduction.doc.html#4560 Java - A Bit of History]</ref><ref>{{Literatur |Autor=Peter Drayton, Ted Neward, Ben Albahari |Titel=C# in a Nutshell: A Desktop Quick Reference |Verlag=O'Reilly |Jahr=2003 |ISBN=978-0-5960-0526-9 |Auflage=2.}}</ref> sind auch objektorientiert und unterstützen seit einiger Zeit<!-- genauer: seit wann? --> Typparameter<!--Generik-->, weshalb ein Vergleich mit ihnen besonders naheliegend ist. Trotz äußerlicher Ähnlichkeiten unterscheiden sie sich aber konzeptionell von C++, zum Teil beträchtlich.<!-- mehr und genauer! --> Insbesondere verfügt ISO-C++ nicht – wie etwa Java – über eine [[Freispeichersammlung]] (''Garbage Collection''), da C++ meist zu direktem Maschinencode kompiliert wird, Java aber in einer virtuellen Maschine läuft, die solche Aufgaben übernehmen kann. Generell ist C++ eher maschinenorientiert als andere ähnliche Sprachen.

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; Abhilfe bietet Java hier allerdings mittels sogenannter Wrapper-Klassen, welche für primitive Typen entsprechende Klassen zur Verfügung stellen (z.&nbsp;B. <tt>Integer</tt> als Wrapper für den primitiven Typ <tt>int</tt>). 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 (Programmierung)|Polymorphie]], einen der fundamentalen Bestandteile der objektorientierten 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.
Zeile 128:Zeile 111:
=== Entstehungsgeschichte ===
=== Entstehungsgeschichte ===


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.
C++ wurde von [[Bjarne Stroustrup]] ab 1979 in den AT&T [[Bell Laboratories]] entwickelt. Ausgangspunkt waren Untersuchungen des [[UNIX]]-Betriebssystemkerns in Bezug auf [[verteiltes Rechnen]].


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 (Programmiersprache)|C]]. Die Wahl fiel auf die Programmiersprache C, da C eine Mehrzwecksprache war, die schnellen Code produzierte und einfach auf andere Plattformen zu [[Portabilität (Informatik)|portieren]] war. Als dem Betriebssystem [[UNIX]] beiliegende Sprache hatte C außerdem eine nicht unerhebliche Verbreitung.
Auf die Idee für eine neue Programmiersprache war Stroustrup schon durch Erfahrungen mit der Programmiersprache [[Simula]] im Rahmen seiner Doktorarbeit an der ''Cambridge University'' gekommen. Simula erschien zwar geeignet für den Einsatz in großen Software-Projekten, die Struktur der Sprache erschwerte aber die für viele praktische Anwendungen erforderliche Erzeugung [[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 nun die Programmiersprache C um ein [[Klasse (objektorientierte Programmierung)|Klassenkonzept]], für das die Sprache ''Simula-67'' das primäre Vorbild war. Die Wahl fiel auf die Programmiersprache [[C (Programmiersprache)|C]], eine Mehrzwecksprache, die schnellen Code produzierte und einfach auf andere Plattformen zu [[Portabilität (Informatik)|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.
Eine der ersten Erweiterungen war ein [[Klasse (objektorientierte Programmierung)|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.
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: 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 (<code>//</code>).
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>).


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.
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 <tt>protected</tt>. 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.
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 <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.
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.
Zeile 146:Zeile 129:
Nach jahrelanger Arbeit wurde schließlich 1998 die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt. 2003 wurde ISO/IEC 14882:2003 verabschiedet, eine Nachbesserung der Norm von 1998.
Nach jahrelanger Arbeit wurde schließlich 1998 die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt. 2003 wurde ISO/IEC 14882:2003 verabschiedet, eine Nachbesserung der Norm von 1998.


Die vorhandenen Performance-Probleme der Sprache C++, die Rechenzeit und Speicherplatz betreffen, werden auf hohem Niveau zusammen mit Lösungen im Technical Report ISO/IEC TR 18015:2006 diskutiert.<ref>[http://www.open-std.org/jtc1/sc22/wg21/docs/TR18015.pdf ISO Technical Report on C++ Performance]</ref> Das Dokument ist zum Download von ISO freigegeben.
Themen der Sprache C++, die Rechenzeit und Speicherplatz betreffen, wurden im so genannten ''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]</ref>


=== Weiterentwicklung der Programmiersprache C++ nach 2006 ===
=== Der Name „C++“ ===


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.
Als Name für C++ war ursprünglich "D"¹ im Gespräch, allerdings entschieden die Entwickler sich gegen diesen Namen (und zugunsten des Namens C++), um die Herkunft der Sprache klar hervorzuheben. Der Name C++ ist eine Wortschöpfung von Rick Mascitti 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 „++“, 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>[http://www2.research.att.com/~bs/bs_faq.html#invention When was C++ invented?] (englisch) – FAQ-Eintrag bei ''[[AT&T Labs Research]]''; Stand: 4.&nbsp;Juli 2011</ref>


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.
¹ <small>Inzwischen existiert [[D (Programmiersprache)|D]] tatsächlich. D ist eine Programmiersprache, die versucht die Effizienz von C++ mit der Produktivität dynamischer Sprachen wie [[Python (Programmiersprache)|Python]] oder [[Ruby (Programmiersprache)|Ruby]] zu vereinen. D ist sehr ähnlich zu C++.</small>


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-Behörde]] angenommen <ref>[http://www.heise.de/newsticker/meldung/C-11-einstimmig-als-Standard-angenommen-1322726.html C++11 einstimmig als Standard angenommen] – Artikel bei ''[[Heise online]]'', vom 13.&nbsp;August 2011</ref> und am 11. Oktober 2011 als ISO/IEC 14882:2011 offiziell veröffentlicht.<ref>[http://www.heise.de/newsticker/meldung/Neue-C-Version-als-ISO-IEC-Standard-veroeffentlicht-1358642.html Neue C++-Version als ISO/IEC-Standard veröffentlicht] – Artikel bei ''Heise online'', vom 11.&nbsp;Oktober 2011</ref><ref>[http://www.golem.de/1110/86960.html Programmiersprache: ISO veröffentlicht C++11] – Artikel bei ''[[Golem.de]]'', vom 11.&nbsp;Oktober 2011</ref> Inoffiziell heißt die Version '''C++11'''.
=== Weiterentwicklung der Programmiersprache C++ ===

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'''<!--zahlenmäßiger Nachweis für "(manchmal auch '''C++200x''')" – gibt es signifikante Vorkommen?--> abgekürzt wurde, worin die Ziffernfolge eine grobe Einschätzung des möglichen Erscheinungstermins andeuten sollte. Im November 2006 wurde der Zieltermin für die Fertigstellung auf das Jahr 2009 festgelegt und die Abkürzung '''C++09''' dafür eingeführt. Im Juli 2009 wurde dieser Termin auf frühestens 2010 geändert. Im August 2011 wurde der Standard einstimmig von der [[International_Organization_for_Standardization|ISO-Behörde]] unter dem Namen '''C++11''' angenommen<ref>[http://www.heise.de/newsticker/meldung/C-11-einstimmig-als-Standard-angenommen-1322726.html C++11 einstimmig als Standard angenommen] – Artikel bei ''[[Heise online]]'', vom 13.&nbsp;August 2011</ref> und ist am 11. Oktober 2011 offiziell veröffentlicht worden.<ref>[http://www.heise.de/newsticker/meldung/Neue-C-Version-als-ISO-IEC-Standard-veroeffentlicht-1358642.html Neue C++-Version als ISO/IEC-Standard veröffentlicht] – Artikel bei ''Heise online'', vom 11.&nbsp;Oktober 2011</ref><ref>[http://www.golem.de/1110/86960.html Programmiersprache: ISO veröffentlicht C++11] – Artikel bei ''[[Golem.de]]'', vom 11.&nbsp;Oktober 2011</ref>

Die vorrangigen Ziele für die Weiterentwicklung von C++ sind Verbesserungen im Hinblick auf die Systemprogrammierung sowie zur Erstellung von Programmbibliotheken. Außerdem soll die Erlernbarkeit der Sprache für Anfänger verbessert werden. Gleichzeitig wurden Mittel übernommen, teilweise auch aus anderen Sprachen, die das Programmieren in einigen Aspekten einfacher und eleganter machen, so zum Beispiel [[Lambda-Funktion]]en, range-basierte For-Schleifen ([[foreach]]) über Vektoren/Arrays oder automatische Typerkennung (Schlüsselwort <code>auto</code>). Laut Bjarne Stroustrup ''fühlt sich C++11 wie eine neue Sprache an: Die Teile passen einfach besser zusammen als vorher und ein [...] abstrakterer Programmierstil ist natürlicher und effizienter als vorher''<ref>http://www2.research.att.com/~bs/C++0xFAQ.html#think</ref>

==== Berücksichtigung aktueller technischer Gegebenheiten ====

C++ deckt 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 macht. Durch ein überarbeitetes Speichermodell sollen Garantien der Sprache für den nebenläufigen Betrieb festgelegt werden, um Mehrdeutigkeiten in der Abarbeitungsreihenfolge sowohl aufzulösen als auch in bestimmten Fällen aufrechtzuerhalten und dadurch Spielraum für Optimierungen zu schaffen. Eine eigene Bibliothek zur Unterstützung von Threads durch die C++11-Standardbibliothek wird ebenfalls durch den neuen Sprachstandard eingeführt.


==== Verbesserungen am Sprachkern ====
==== 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ört die [[Typinferenz]] zur Ableitung von Ergebnistypen aus Ausdrücken und die sogenannten ''r-value references'', mit deren Hilfe sich als Ergänzung zu dem bereits vorhandenen ''Kopieren'' von Objekten dann auch ein ''Verschieben'' realisieren lässt.
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>[http://www2.research.att.com/~bs/C++0xFAQ.html#think www2.research.att.com]</ref>


==== Erweiterung der Programmbibliothek ====
==== Erweiterung der Programmbibliothek ====
Im April 2006 gab das C++-Standardisierungskomitee den sogenannten ersten technischen Report (TR1) heraus, eine nichtnormative 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.


Enthalten waren im TR1 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] (englisch) – Webdokument bei ''Open Standards'', vom 3.&nbsp;März 2003</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] (englisch) – Webdokument bei ''Open Standards'', vom 27.&nbsp;März 2003</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] (englisch) – Webdokument bei ''Open Standards'', vom 9.&nbsp;April 2003</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] (englisch) – Webdokument bei ''Open Standards'', vom 10.&nbsp;April 2003</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] (englisch, <small><span title="Portable Document Format">PDF</span> &asymp;&nbsp;164&nbsp;<span title="Kilobyte">KB</span></small>) – Dokumemt bei ''Open Standards'', vom 8.&nbsp;November 2002</ref> sowie [[Numerik|numerische]] und mathematische Bibliotheken.<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] (englisch) – Webdokument bei ''Open Standards'', vom 24.&nbsp;Februar 2003</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] (englisch) – Webdokument bei ''Open Standards'', von 2004</ref>
Im April 2006 gab das C++-Standardisierungskomitee den sogenannten ersten technischen Report (TR1) heraus, eine nichtnormative 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 liefern den TR1 mit ihren Produkten aus.


Mit Ausnahme der numerischen und mathematischen Bibliotheken wurden alle TR1-Erweiterungen in die Sprachnorm C++11 übernommen.
Enthalten sind im TR1 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] (englisch) – Webdokument bei ''Open Standards'', vom 3.&nbsp;März 2003</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] (englisch) – Webdokument bei ''Open Standards'', vom 27.&nbsp;März 2003</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] (englisch) – Webdokument bei ''Open Standards'', vom 9.&nbsp;April 2003</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] (englisch) – Webdokument bei ''Open Standards'', vom 10.&nbsp;April 2003</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] (englisch, <small><span title="Portable Document Format">PDF</span> &asymp;&nbsp;164&nbsp;<span title="Kilobyte">KB</span></small>) – Dokumemt bei ''Open Standards'', vom 8.&nbsp;November 2002</ref> sowie [[Numerik|numerische]] und mathematische Bibliotheken.<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] (englisch) – Webdokument bei ''Open Standards'', vom 24.&nbsp;Februar 2003</ref> Die meisten dieser Erweiterungen stammen aus der [[Boost (C++-Bibliothek)|Boost]]-Bibliothek, woraus sie mit minimalen Änderungen übernommen wurden. Außerdem sind 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] (englisch) – Webdokument bei ''Open Standards'', von 2004</ref>


Ebenfalls wurde eine eigene Bibliothek zur Unterstützung von Threads eingeführt.
Mit Ausnahme der numerischen und mathematischen Bibliotheken wurde die Übernahme aller TR1-Erweiterungen in die kommende Sprachnorm C++0x bereits vom C++-Standardisierungskomitee beschlossen.


== Siehe auch ==
=== 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 „++“, 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>[http://www2.research.att.com/~bs/bs_faq.html#invention When was C++ invented?] (englisch) – FAQ-Eintrag bei ''[[AT&T Labs Research]]''; Stand: 4.&nbsp;Juli 2011</ref>


== Siehe auch ==
* [[C++-Standardbibliothek]]
* [[Ressourcenbelegung ist Initialisierung]] (RAII)
* [[C++/CLI]]
* [[C++/CLI]]
* [[Embedded C++]], eine Variante der Sprache C++ für [[Eingebettetes System|eingebettete Systeme]]
* [[Embedded C++]], eine Variante der Sprache C++ für [[Eingebettetes System|eingebettete Systeme]]


== Literatur ==
== Literatur ==

* {{Literatur
* {{Literatur
|Autor = [[Bjarne Stroustrup]]
|Autor = [[Bjarne Stroustrup]]
|Titel = Die C++-Programmiersprache
|Titel = Die C++-Programmiersprache
|Verlag = Addison-Wesley | Auflage = 4. | Jahr = 2009 | ISBN = 978-3-8273-2823-6 | Kommentar = Standardwerk zu C++, Grundkenntnisse in C von Vorteil. }}
|Verlag = Addison-Wesley | Auflage = 4. | Jahr = 2009 | ISBN = 978-3-8273-2823-6 | Kommentar = Standardwerk zu C++, Grundkenntnisse in C von Vorteil. }}

* {{Literatur
* {{Literatur
|Autor = Bjarne Stroustrup
|Autor = Bjarne Stroustrup
Zeile 197:Zeile 172:
|ISBN = 978-0201543308
|ISBN = 978-0201543308
|Kommentar = Das Buch beschreibt die Entwicklung und Design von C++; Vom Sprachdesigner geschrieben.}}
|Kommentar = Das Buch beschreibt die Entwicklung und Design von C++; Vom Sprachdesigner geschrieben.}}

* {{Literatur
* {{Literatur
|Autor = Bjarne Stroustrup
|Autor = Bjarne Stroustrup
Zeile 204:Zeile 178:
|Jahr = 2008
|Jahr = 2008
|ISBN = 978-0321543721
|ISBN = 978-0321543721
|Kommentar = Einführung in die Programmierung; Standardwerk für Texas A&M Einstiegsprogrammierkurse}}
|Kommentar = Einführung in die Programmierung; Standardwerk für Einstiegsprogrammierkurse an der Universität Texas A&M}}

* {{Literatur
* {{Literatur
|Autor = Andrew Koenig, Barbara E. Moo
|Autor = Andrew Koenig, Barbara E. Moo
|Titel = Intensivkurs C++
|Titel = Intensivkurs C++
|Verlag = Pearson Studium | Auflage = 1. | Jahr = 2003 | ISBN = 3-8273-7029-9 | Kommentar = Vergriffen, Anfängerbuch, ein gewisses Grundverständnis der Programmierung ist von Vorteil.}}
|Verlag = Pearson Studium | Auflage = 1. | Jahr = 2003 | ISBN = 3-8273-7029-9 | Kommentar = Anfängerbuch, ein gewisses Grundverständnis der Programmierung ist von Vorteil.}}

* {{Literatur
* {{Literatur
|Autor = Scott Meyers
|Autor = Scott Meyers
|Titel = Effektiv C++ Programmieren – 55 Möglichkeiten, Ihre Programme und Entwürfe zu verbessern
|Titel = Effektiv C++ Programmieren – 55 Möglichkeiten, Ihre Programme und Entwürfe zu verbessern
|Verlag = Addison-Wesley | Auflage = 1. | Jahr = 2006 | ISBN = 3-8273-2297-9 | Kommentar = Zur Vertiefung bereits vorhandener C++-Kenntnisse.}}
|Verlag = Addison-Wesley | Auflage = 1. | Jahr = 2006 | ISBN = 3-8273-2297-9 | Kommentar = Zur Vertiefung bereits vorhandener C++-Kenntnisse.}}

* {{Literatur
* {{Literatur
|Autor = Scott Meyers
|Autor = Scott Meyers
|Titel = Mehr Effektiv C++ programmieren – 35 neue Wege zur Verbesserung Ihrer Programme und Entwürfe
|Titel = Mehr Effektiv C++ programmieren – 35 neue Wege zur Verbesserung Ihrer Programme und Entwürfe
|Verlag = Addison-Wesley | Auflage = 1. | Jahr = 1997 | ISBN = 3-8273-1275-2 | Kommentar = Vertiefung vorhandener C++-Kenntnisse.}}
|Verlag = Addison-Wesley | Auflage = 1. | Jahr = 1997 | ISBN = 3-8273-1275-2 | Kommentar = Vertiefung vorhandener C++-Kenntnisse.}}

* {{Literatur
* {{Literatur
|Autor =[[Herb Sutter]]
|Autor = [[Herb Sutter]]
|Titel = Exceptional C++ | Verlag = Addison-Wesley | Auflage = 1. | Jahr = 2000 | ISBN = 3-8273-1711-8 | Kommentar = Vertiefung vorhandener C++-Kenntnisse.}}
|Titel = Exceptional C++ | Verlag = Addison-Wesley | Auflage = 1. | Jahr = 2000 | ISBN = 3-8273-1711-8 | Kommentar = Vertiefung vorhandener C++-Kenntnisse.}}

* {{Literatur
* {{Literatur
|Autor = [[Andrei Alexandrescu]]
|Autor = [[Andrei Alexandrescu]]
|Titel = Modernes C++ Design – Generische Programmierung und Entwurfsmuster angewendet
|Titel = Modernes C++ Design – Generische Programmierung und Entwurfsmuster angewendet
|Verlag = Mitp-Verlag| Auflage = 1. | Jahr = 2003 | ISBN = 3-8266-1347-3 | Kommentar = Ein Standardwerk zur [[C++-Metaprogrammierung]], setzt ein tiefes Verständnis von C++ voraus.}}
|Verlag = Mitp-Verlag| Auflage = 1. | Jahr = 2003 | ISBN = 3-8266-1347-3 | Kommentar = Ein Standardwerk zur [[C++-Metaprogrammierung]], setzt ein tiefes Verständnis von C++ voraus.}}

* {{Literatur
* {{Literatur
|Autor = [[Bruce Eckel]]
|Autor = [[Bruce Eckel]]
|Titel = Thinking in C++, Volume 1: Introduction to Standard C++
|Titel = Thinking in C++, Volume 1: Introduction to Standard C++
|Verlag = Prentice Hall | Jahr = 2000 | Auflage = 2. | ISBN = 0-13-979809-9 | Online = [http://jamesthornton.com/eckel/ Online] }}
|Verlag = Prentice Hall | Jahr = 2000 | Auflage = 2. | ISBN = 0-13-979809-9 | Online = [http://jamesthornton.com/eckel/ Online] }}

* {{Literatur
* {{Literatur
|Autor = Bruce Eckel
|Autor = Bruce Eckel
|Titel = Thinking in C++, Volume 2: Practical Programming
|Titel = Thinking in C++, Volume 2: Practical Programming
|Verlag = Prentice Hall | Jahr = 2003 | Auflage = 1. | ISBN = 0-13-035313-2 | Online = [http://jamesthornton.com/eckel/ Online] }}
|Verlag = Prentice Hall | Jahr = 2003 | Auflage = 1. | ISBN = 0-13-035313-2 | Online = [http://jamesthornton.com/eckel/ Online] }}

* {{Literatur
|Autor = Herbert Schildt
|Titel = Learn C++ from the Ground Up
|Verlag = McGraw Hill - Osborne | Auflage = 3. | Jahr = 2003 | ISBN = 978-0-0722-2897-7 }}
<!-- Neue Einträge bitte auf der Diskussionsseite begründen. Einen Kommentar zu Stärken und Schwächen des jeweiligen Buches hinzufügen!! -->
<!-- Neue Einträge bitte auf der Diskussionsseite begründen. Einen Kommentar zu Stärken und Schwächen des jeweiligen Buches hinzufügen!! -->


== Weblinks ==
== Weblinks ==

{{Wikibooks|C++-Programmierung}}
* [http://www.open-std.org/jtc1/sc22/wg21/ Webauftritt des C++-Standardisierungskomitees] (englisch)
* [http://www.open-std.org/jtc1/sc22/wg21/ Webauftritt des C++-Standardisierungskomitees] (englisch)
* [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf Working Draft, Standard for Programming Language C++] (englisch)
* [http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3376.pdf Working Draft, Standard for Programming Language C++] (englisch)
* [http://www.cs.tamu.edu/news/items?id=1797 Bjarne Stroustrup über die Geschichte von C++ zwischen 1991 und 2006 (HOPL-III)] (englisch)
* [http://www.cs.tamu.edu/news/items?id=1797 Bjarne Stroustrup über die Geschichte von C++ zwischen 1991 und 2006 (HOPL-III)] (englisch)
* {{dmoz|World/Deutsch/Computer/Programmieren/Sprachen/C++|C++}}
<!-- Bitte nur hochwertige Links hinzufügen und vorhandene schlechtere Links ersetzen um die Anzahl klein zu halten!!
<!-- Bitte nur hochwertige Links hinzufügen und vorhandene schlechtere Links ersetzen um die Anzahl klein zu halten!!
Achtung: Im DMOZ finden sich bereits viele gute Links in mehreren Sprachen.
Achtung: Im DMOZ finden sich bereits viele gute Links in mehreren Sprachen.
-->
-->
<!-- "| " sorgt dafür, dass der Artikel als Oberartikel der Kategorie erkannt wird. Bitte _nicht_ löschen -->
<!-- | sorgt dafür, dass der Artikel als Oberartikel der Kategorie erkannt wird. Bitte _nicht_ löschen -->
<!-- Kategorie:Programmiersprache bitte NICHT hinzufügen, Programmiersprache C++ ist die richtige (Unter-)Kategorie. -->
<!-- Kategorie:Programmiersprache bitte NICHT hinzufügen, Programmiersprache C++ ist die richtige (Unter-)Kategorie. -->


== Einzelnachweise ==
== Einzelnachweise ==

<references />
<references />



Version vom 28. Juni 2012, 23:29 Uhr

C++
Erscheinungsjahr:1983
Designer:Bjarne Stroustrup
Entwickler:Bjarne Stroustrup
Aktuelle VersionC++20[1] (Dezember 2020)
Typisierung:statisch, schwach, unsicher
Standardisierungen:ISO/IEC 14882:1998,
ISO/IEC 14882:2003,
ISO/IEC TR 19768:2007,
ISO/IEC 14882:2011
Beeinflusst von:C, Simula, Algol 68, CLU, Meta Language, Ada
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.

Einsatzgebiete

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

Systemprogrammierung

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

Bei der Anwendungsprogrammierung kommt C++ vor allem dort zum Einsatz, wo maximale Forderungen an die Effizienz gestellt werden, um durch technische Rahmenbedingungen vorgegebene Leistungsgrenzen möglichst gut auszunutzen. In den Jahren 2000 bis etwa 2010 wurde C++ aus der Domäne der Anwendungsprogrammierung zum Teil von den Sprachen Java und C# zurückgedrängt. Danach gewann C++ mit dem Aufkommen mobiler Geräte aufgrund Ressourcen-sparender sowie effizienterer und dadurch stromsparenderer Applikationen wieder Marktanteile in der Applikationsprogrammierung zurück.

Eigenschaften

Sprachdesign

Die Sprache C++ legt einen Schwerpunkt auf die Sprachmittel zur Entwicklung von Bibliotheken und favorisiert dadurch verallgemeinerte Mechanismen gegenüber in die Sprache integrierten Einzellösungen für typische Problemstellungen.

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.

Kompatibilität mit C

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.

Die letzten Änderungen an C fanden im Jahr 1999 statt (ISO/IEC 9899:1999, auch kurz C99 genannt), also nach der Normung von C++, 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.

Sprachmerkmale im Detail

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äumen, Inline-Funktionen, Überladen von Operatoren und Funktionsnamen, Referenzen, Operatoren zur Freispeicherverwaltung und mit der C++-Standardbibliothek eine erweiterte Bibliothek.

Programmbeispiel

Der folgende Quelltext stellt ein einfaches C++-Programm dar, das die Meldung Hallo Welt! auf dem Standardausgabemedium ausgibt:

#include <iostream>
#include <ostream> // Ab C++11 nicht mehr nötig

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

Erläuterungen: Bei main handelt es sich um die Haupt-Funktion. Sie ist in jedem C++-Programm vorhanden und dient als Einstiegspunkt des Programms. Die Funktion main ist die einzige Funktion, die – obwohl sie einen Wert zurückgibt – nicht die Anweisung „return“ benötigt. Ohne die explizite Anweisung return gibt main den Wert 0 zurück.

cout ist eine Variable vom Typ der ostream-Klasse, die sich im Namensraum „std“ befindet und durch den Bereichsoperator (::) angesprochen wird. cout wird in der Header-Datei <iostream> deklariert und in <ostream> definiert: Sie wird auf den Ausgabedatenstrom stdout gelenkt.

std::endl erzeugt einen Zeilenumbruch.

Der Operator << verknüpft die Ausgaben miteinander.

Umsetzung

C++-Compiler

Die Implementierung eines C++-Compilers gilt als aufwändig. Seit 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:

  • Der in Microsoft Visual C++ enthaltene Compiler ist einer der verbreitetsten für das Betriebssystem Windows.
  • 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) erstellt, 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.
  • Der Intel C++ Compiler verwendet ebenfalls das 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 X. Da die mit dem Intel C++ Compiler erzeugten Programme den Befehlssatz der Intel-Prozessoren besonders gut ausnutzen, erzeugen sie besonders effiziente Programme für Intel-Prozessoren.
  • Clang, ein Frontend für die von Apple geförderte plattformübergreifende Compilerinfrastruktur LLVM, die unter anderem auch in der integrierten Entwicklungsumgebung Xcode verwendet wird. [3]
  • Der g++ ist die C++-Ausprägung der GNU Compiler Collection (GCC); g++ ist quelloffen und frei verfügbar. Der g++ unterstützt viele Betriebssysteme (darunter Unix, Linux, Mac OS X, Windows und AmigaOS) und Prozessorplattformen. GNU C++ existiert seit 1987 und ist somit einer der ältesten C++-Compiler.[4]

C++-Programmierung

Das breite Leistungsspektrum und die vielfältigen Gestaltungsmöglichkeiten der Sprache sowie die Bibliotheken führen zu verhältnismäßig langen Einarbeitungszeiten. Im Vergleich mit C bietet C++ eine enorme Fülle an Sprachmitteln.

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++ an Smalltalk und nicht an Simula orientierte. Die Syntax von Objective-C unterscheidet sich unter anderem wegen der Smalltalk-Wurzeln stark von C++. Objective-C ist deutlich weniger weit verbreitet als C++. Wichtigstes Einsatzgebiet von Objective-C ist die Programmierung unter den Betriebssystemen Apple iOS und Mac OS X sowie unter der Programmierschnittstelle OpenStep.

Java und C#

Die Programmiersprachen Java und C# verfügen über eine ähnliche, ebenfalls an C angelehnte Syntax wie C++,[5] 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.

Siehe auch: Simula, Smalltalk

Entstehung und Weiterentwicklung

Entstehungsgeschichte

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 nicht unerhebliche 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.

Nach jahrelanger Arbeit wurde schließlich 1998 die endgültige Fassung der Sprache C++ (ISO/IEC 14882:1998) genormt. 2003 wurde ISO/IEC 14882:2003 verabschiedet, eine Nachbesserung der Norm von 1998.

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

Weiterentwicklung der Programmiersprache C++ nach 2006

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.

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-Behörde angenommen [7] und am 11. Oktober 2011 als ISO/IEC 14882:2011 offiziell veröffentlicht.[8][9] 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 (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.[10]

Erweiterung der Programmbibliothek

Im April 2006 gab das C++-Standardisierungskomitee den sogenannten ersten technischen Report (TR1) heraus, eine nichtnormative 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.

Enthalten waren im TR1 u. a. reguläre Ausdrücke,[11] verschiedene intelligente Zeiger,[12] ungeordnete assoziative Container,[13] eine Zufallszahlenbibliothek,[14] Hilfsmittel für die C++-Metaprogrammierung, Tupel[15] sowie numerische und mathematische Bibliotheken.[16] 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.[17]

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.

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-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).[18]

Siehe auch

Literatur

  • Bjarne Stroustrup: Die C++-Programmiersprache. 4. Auflage. Addison-Wesley, 2009, ISBN 978-3-8273-2823-6 (Standardwerk zu C++, Grundkenntnisse in C von Vorteil.).
  • Bjarne Stroustrup: The Design and Evolution of C++. Addison-Wesley, 1994, ISBN 978-0-201-54330-8 (Das Buch beschreibt die Entwicklung und Design von C++; Vom Sprachdesigner geschrieben.).
  • Bjarne Stroustrup: Programming -- Principles and Practice Using C++. Addison-Wesley, 2008, ISBN 978-0-321-54372-1 (Einführung in die Programmierung; Standardwerk für Einstiegsprogrammierkurse an der Universität Texas A&M).
  • Andrew Koenig, Barbara E. Moo: Intensivkurs C++. 1. Auflage. Pearson Studium, 2003, ISBN 3-8273-7029-9 (Anfängerbuch, ein gewisses Grundverständnis der Programmierung ist von Vorteil.).
  • Scott Meyers: Effektiv C++ Programmieren – 55 Möglichkeiten, Ihre Programme und Entwürfe zu verbessern. 1. Auflage. Addison-Wesley, 2006, ISBN 3-8273-2297-9 (Zur Vertiefung bereits vorhandener C++-Kenntnisse.).
  • Scott Meyers: Mehr Effektiv C++ programmieren – 35 neue Wege zur Verbesserung Ihrer Programme und Entwürfe. 1. Auflage. Addison-Wesley, 1997, ISBN 3-8273-1275-2 (Vertiefung vorhandener C++-Kenntnisse.).
  • 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.).
  • Bruce Eckel: Thinking in C++, Volume 1: Introduction to Standard C++. 2. Auflage. Prentice Hall, 2000, ISBN 0-13-979809-9 (Online).
  • Bruce Eckel: Thinking in C++, Volume 2: Practical Programming. 1. Auflage. Prentice Hall, 2003, ISBN 0-13-035313-2 (Online).

Einzelnachweise

  1. ISO/IEC 14882:2020 Programming languages — C++. Dezember 2020.
  2. The Programming Languages Beacon
  3. clang.llvm.org
  4. Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006.
  5. 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.
  6. ISO Technical Report on C++ Performance
  7. C++11 einstimmig als Standard angenommen – Artikel bei Heise online, vom 13. August 2011
  8. Neue C++-Version als ISO/IEC-Standard veröffentlicht – Artikel bei Heise online, vom 11. Oktober 2011
  9. Programmiersprache: ISO veröffentlicht C++11 – Artikel bei Golem.de, vom 11. Oktober 2011
  10. www2.research.att.com
  11. A Proposal to add Regular Expressions to the Standard Library (englisch) – Webdokument bei Open Standards, vom 3. März 2003
  12. A Proposal to Add General Purpose Smart Pointers to the Library Technical Report (englisch) – Webdokument bei Open Standards, vom 27. März 2003
  13. A Proposal to Add Hash Tables to the Standard Library (englisch) – Webdokument bei Open Standards, vom 9. April 2003
  14. A Proposal to Add an Extensible Random Number Facility to the Standard Library (englisch) – Webdokument bei Open Standards, vom 10. April 2003
  15. Proposal for adding tuple types into the standard library (englisch, PDF ≈ 164 KB) – Dokumemt bei Open Standards, vom 8. November 2002
  16. A Proposal to Add Mathematical Special Functions to the C++ Standard Library (englisch) – Webdokument bei Open Standards, vom 24. Februar 2003
  17. ISO/IEC JTC1/SC22/WG21 N1568 (englisch) – Webdokument bei Open Standards, von 2004
  18. When was C++ invented? (englisch) – FAQ-Eintrag bei AT&T Labs Research; Stand: 4. Juli 2011