C++

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
C++
Paradigmen: Multiparadigmen (generisch, imperativ, objektorientiert, prozedural, strukturiert)
Erscheinungsjahr: 1985
Entwickler: Bjarne Stroustrup
Typisierung: statisch (dynamische Typprüfung möglich), explizit, 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
Beeinflusst von: C, Simula, Ada, ALGOL 68, CLU, ML
Beeinflusste: C#, Java, PHP, Perl, D, Go, Vala

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[Bearbeiten]

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

Systemprogrammierung[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]

Bei der Anwendungsprogrammierung kommt C++ vor allem dort zum Einsatz, wo hohe Forderungen 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.

Eigenschaften[Bearbeiten]

Sprachdesign[Bearbeiten]

Die Sprache C++ besteht aus sehr wenigen Schlüsselwörtern („Sprachkern“); ihre eigentliche Funktionalität erhält sie – ähnlich wie auch die Sprache C – durch die C++-Standardbibliothek sowie, je nach Einsatzgebiet, zusätzliche Bibliotheken und Frameworks. 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:

Speicherverwaltung[Bearbeiten]

C++ verzichtet auf Garbage-Collection, so dass andere Speicherverwaltungstechniken, meist RAII, verwendet werden müssen. Darüber hinaus ist es möglich, Speicher manuell zu verwalten, auch wenn hiervon meist dringend abgeraten wird.[2]

Unvollständige Objektorientierung[Bearbeiten]

In C++ gehören private Eigenschaften (Variablen und Methoden) normalerweise mit zum in der Header-Datei veröffentlichten Interface. Dadurch entstehen zur Compilezeit und zur Laufzeit Abhängigkeiten der Objekte zu den Code-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 Klasse (z. B. example_class::impl) verschoben, und ein Pointer auf ein Objekt dieser Unterklasse (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 Quelltext, der nur die Header-Datei verwendet, unsichtbar. Dadurch, dass die Unterklasse nur durch einen Pointer referenziert wird, bleiben alle Quelltextänderungen an privaten Feldern transparent und die Binärkompatibilität wird erhalten.[3]

Außerdem sind die Speicherbereiche der einzelnen Objekte zur Laufzeit nicht vor (absichtlichen oder versehentlichen) gegenseitigen Änderungen geschützt.

Komplizierte Grammatik[Bearbeiten]

Die Grammatik von C++ wird oft als kompliziert eingeordnet. So ist beispielsweise die Bedeutung des folgenden Codeschnipsels vollständig vom Kontext abhängig:

A < B , C > D;

Entweder könnte „A“ ein Klassentemplate sein, was zur Folge hätte, dass der Code eine neue lokale Variable namens „D“ erzeugt, die das mit „B“ und „C“ instanziierte Template als Typ hat. Alternativ könnten „A“, „B“, „C“ und „D“ Variablen sein, was zur Folge hätte, dass der Code zunächst den kleiner-als-Operator auf „A“ und „B“ anwenden würde, dessen Rückgabewert verwerfen würde, und im Anschluss den größer-als-Operator auf „C“ und „D“ anwenden würde, dessen Rückgabewert der Rückgabewert des gesamten Ausdrucks würde.

Undefiniertes Verhalten[Bearbeiten]

Das Verhalten von diversen Sprachkonstrukten ist nicht definiert. Dies bedeutet, dass der Standard nicht vorgibt, was in einem solchen Falle 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 gefährlichen Sicherheitslücken. Während hierdurch zum Teil große Optimierungen für Compiler ermöglicht werden, kommt es auf der anderen Seite wiederholt dazu, dass fehlerhafter Quellcode von neuen Compilerversionen auf unerwartete und absurd scheinende Art umgesetzt wird. 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.[4][5]

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.

Beispiele:

  • Überlauf von vorzeichenbehafteten Ganzzahlen (auch z. B. bei Umwandlung von unsigned int nach int)
  • Nullzeiger-Dereferenzierungen
  • Arrayzugriffe mit ungültigem Index
  • Schiebeoperationen um mehr Binärstellen als der zu schiebende Typ Bits hat
  • Division durch null mit integralen Datentypen
  • Weglassen des return-Statements in Funktionen mit Rückgabewert (die Hauptfunktion main bildet die einzige Ausnahme)

Kompatibilität mit C[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]

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[Bearbeiten]

Der folgende Quelltext ist ein einfaches C++-Programm, das den Text Hallo Welt! auf dem Standardausgabemedium (normalerweise Bildschirm) ausgibt:

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

Erläuterungen: #include bindet Header-Dateien ein, die typischerweise Definitionen von Typen und Konstanten und Deklarationen von Funktionen enthalten. Die Datei iostream gehört zur Standardbibliothek und definiert unter anderem die Ein- und Ausgabeobjekte cin, cout und cerr für die aus der C-Standardbibliothek bekannten Spezialdateien stdin, stdout und stderr, die auf die Konsole schreiben oder von ihr lesen. Im Gegensatz zu C besitzen die Headerdateien der Standardbibliothek nicht die Dateiendung *.h.

Bei main handelt es sich um die Haupt-Funktion. Sie ist in jedem C++-Programm vorhanden und dient als Einstiegspunkt des Programms. Das Programm wird ausgeführt, indem die Funktion main aufgerufen wird, wobei diese ihrerseits andere Funktionen aufrufen kann. Der Standard erlaubt zwei Versionen der main(): Die erste hat keine Funktionsparameter (wie oben) und gibt ein int zurück, die zweite Version nimmt einen integralen Skalar und einen zweifach-indirekten Zeiger (ein Array von Zeichenketten) entgegen, um so auf die Kommandozeilenparameter zugreifen zu können (was in einigen Programmen nicht nötig und deswegen nicht zwingend ist):

int main (int argc, char *argv[]) { ... }

cout ist ein Objekt der ostream-Klasse, die sich im Namensraum „std“ befindet und durch den Bereichsoperator (::) angesprochen wird. cout wird in der Header-Datei iostream deklariert und lenkt die Ausgabe auf den Ausgabedatenstrom stdout.

std::endl gibt einen Zeilenumbruch aus und leert den Puffer, so dass die darin befindlichen Daten sofort ausgegeben (und damit auf dem Bildschirm sichtbar) werden.

Der Operator << ruft die Ausgabe-Operation auf; er ist in der Klasse std::ostream überladen und wird von std::ofstream geerbt.

Umsetzung[Bearbeiten]

C++-Compiler[Bearbeiten]

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

  • Der in Microsoft Visual C++ enthaltene Compiler ist einer der verbreitetsten für das Betriebssystem Windows.
  • 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, Mac OS X, Windows und AmigaOS) und Prozessorplattformen. GNU C++ existiert seit 1987 und ist somit einer der ältesten C++-Compiler.[6]
  • 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 diese Plattform. (Compilate des Intel-Compilers laufen ebenfalls auf AMD-Chips meist schneller als Compilate der alternativen Compiler, entsprechende Optimierungsflags sperrt Intel jedoch - die Sperre lässt sich aufheben.)
  • 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.[7]

C++-Programmierung[Bearbeiten]

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[Bearbeiten]

Objective-C[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++ an Smalltalk und nicht an Simula orientierte. Die Syntax von Objective-C unterscheidet sich unter anderem wegen der Smalltalk-Wurzeln stark von 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#[Bearbeiten]

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

Entstehung und Weiterentwicklung[Bearbeiten]

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

Weiterentwicklung der Programmiersprache C++ nach 2005[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.

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[9] und am 11. Oktober 2011 als ISO/IEC 14882:2011 offiziell veröffentlicht.[10][11] Inoffiziell heißt die Version C++11.

Verbesserungen am Sprachkern[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.[12]

Erweiterung der Programmbibliothek[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.

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

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[Bearbeiten]

Die aktuelle Fassung von C++ (Juli 2012) ist ISO/IEC 14882:2011, auch bekannt als C++11. C++11 führt Lambdas (Anonyme Funktionen) ein, sowie erleichterte Typbehandlung mit Typinferenz über das Schlüsselwort auto (das nun nicht mehr ein Speicherklassen-Specifier ist) einerseits und das Schlüsselwort decltype andererseits. Ein for-Statement erleichtert die Arbeit mit STL-Containern und Arrays, und es dürfen direkt aufeinanderfolgende spitze Klammern bei Templates benutzt werden: map<int, vector<int>>. Streng typisierte enums (enum class) beseitigen Probleme mit Namenskollisionen. Außerdem wurden einige Features aus C11 übernommen, zum Beispiel 64 Bit-Integer mit long long oder Zusicherungen zur Übersetzungszeit mittels static_assert (in C11: _Static_assert).[20]

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

Der Name „C++“[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).[22]

Kritik[Bearbeiten]

Dieser Artikel oder nachfolgende Abschnitt ist nicht hinreichend mit Belegen (beispielsweise Einzelnachweisen) ausgestattet. Die fraglichen Angaben werden daher möglicherweise demnächst entfernt. Bitte hilf der Wikipedia, indem du die Angaben recherchierst und gute Belege einfügst. Näheres ist eventuell auf der Diskussionsseite oder in der Versionsgeschichte angegeben. Bitte entferne zuletzt diese Warnmarkierung.
Kritik sollte belegbar sein. Und fundierte Kritik kann nur von Leuten kommen, die sich mit C++ auch auskennen (was nur geht, wenn sie es selber auch benutzen: „Kritik von innen“) --RokerHRO (Diskussion) 12:04, 21. Mai 2013 (CEST)

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

  • C++ sei sehr komplex und fehleranfällig zu programmieren. Man brauche recht lange, um es gut zu beherrschen und viele Features gelten als äußerst komplex.
  • 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 nicht vorhanden (Garbage Collection).
  • 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.[23]
  • 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.“[24]

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 auf ungültige Speicherbereiche können das ganze Programm zum Absturz bringen (Hängender Zeiger).

Siehe auch[Bearbeiten]

Literatur[Bearbeiten]

  •  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-0201543308 (Das Buch beschreibt die Entwicklung und das Design von C++; Vom Sprachdesigner geschrieben.).
  •  Bjarne Stroustrup: Programming – Principles and Practice Using C++. Addison-Wesley, 2008, ISBN 978-0321543721 (Einführung in die Programmierung; Standardwerk für Einstiegsprogrammierkurse an der Universität Texas A&M).
  •  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.).
  •  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).

Weblinks[Bearbeiten]

 Wikibooks: C++-Programmierung – Lern- und Lehrmaterialien

Einzelnachweise[Bearbeiten]

  1. The Programming Languages Beacon
  2. C++-FAQ von Bjarne Stroustrup über Speicherlecks (englisch); abgerufen am 3. Mai 2013.
  3. Das d-Zeiger-Idiom auf heise Developer
  4. Undefiniertes Verhalten bei mehrfacher Zuweisung, abgerufen 20. August 2014
  5. Scott Meyers, Effektiv C++ Programmieren, Addison-Wesley, Seiten 22/23, 43/44 und 46, nach Google-Books, abgerufen 20. August 2014
  6. Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991-2006. (PDF; 690 kB)
  7. clang.llvm.org
  8. 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-5960-0526-9.
  9. C++11 einstimmig als Standard angenommen – Artikel bei Heise online, vom 13. August 2011
  10. Neue C++-Version als ISO/IEC-Standard veröffentlicht – Artikel bei Heise online, vom 11. Oktober 2011
  11. Programmiersprache: ISO veröffentlicht C++11 – Artikel bei Golem.de, vom 11. Oktober 2011
  12. C++11 FAQ
  13. A Proposal to add Regular Expressions to the Standard Library (englisch) – Webdokument bei Open Standards, vom 3. März 2003
  14. A Proposal to Add General Purpose Smart Pointers to the Library Technical Report (englisch) – Webdokument bei Open Standards, vom 27. März 2003
  15. A Proposal to Add Hash Tables to the Standard Library (englisch) – Webdokument bei Open Standards, vom 9. April 2003
  16. A Proposal to Add an Extensible Random Number Facility to the Standard Library (englisch) – Webdokument bei Open Standards, vom 10. April 2003
  17. Proposal for adding tuple types into the standard library (englisch, PDF ≈ 164 KB; 164 kB) – Dokument bei Open Standards, vom 8. November 2002
  18. A Proposal to Add Mathematical Special Functions to the C++ Standard Library (englisch) – Webdokument bei Open Standards, vom 24. Februar 2003
  19. ISO/IEC JTC1/SC22/WG21 N1568 (englisch) – Webdokument bei Open Standards, von 2004
  20. B. Stroustrup: C++11 FAQ
  21. ISO Technical Report on C++ Performance (PDF; 1,2 MB)
  22. When was C++ invented? (englisch) – FAQ-Eintrag bei AT&T Labs Research; Stand: 4. Juli 2011
  23. Coding Horror: The Problem with C++
  24. Bjarne Stroustrup’s FAQ: Did you really say that?