C++
Paradigmen | Multi-Paradigma: prozedural, Imperativ, funktional, objektorientierter, generisch, modular |
---|---|
Familie | C |
Entworfen von | Bjarne Stroustrup |
Entwickler | ISO / IEC JTC 1 (gemeinsamer technischer Ausschuss 1) / SC 22 (Unterausschuss 22) / WG 21 (Arbeitsgruppe 21) |
Erstmals erschienen | 1985 |
Stabile Version | C ++ 20 (ISO / IEC 14882: 2020) / 15. Dezember 2020 |
Vorschau -Version | C ++ 23 / 17. März 2022 |
Disziplin tippen | Statisch, Nominativ, teilweise abgeleitet |
OS | Plattformübergreifend |
Dateiname -Erweiterungen | .C, .cc, .cpp, .cxx, .c ++, .H, .H, .HH, .HPP, .HXX, .H ++ |
Webseite | ISOCPP |
Haupt Implementierungen | |
GCC, Llvm clang, Microsoft Visual C ++, Embarcadero C ++ Builder, Intel C ++ - Compiler, IBM XL C ++, Edg | |
Beeinflusst von | |
Ada, Algol 68,[1] BCPL,[2] C, Clu,[1] Ml, Mesa,[1] Modula-2,[1] Simula, Smalltalk[1] | |
Beeinflusst | |
ADA 95, C#,[3] C99, Kapelle,[4] Clojure,[5] D, Java,[6] JS ++,[7] Lua, Nim,[8] Ziel-C ++, Perl, Php, Python,[9] Rost, Samen7 | |
|
C ++ (/ˌsichˌplʌsˈplʌs/) ist ein Allzweckprogrammiersprache Erstellt von dänischer Informatiker Bjarne Stroustrup als Erweiterung der C Programmiersprache, oder "C mit Klassen"Die Sprache hat sich im Laufe der Zeit erheblich erweitert, und moderne C ++ objektorientierter, generisch, und funktional Funktionen zusätzlich zu Einrichtungen für niedriger Ebene Erinnerung Manipulation. Es wird fast immer als implementiert als kompilierte Spracheund viele Anbieter bieten C ++ Compiler, einschließlich der Kostenlose Software -Stiftung, Llvm, Microsoft, Intel, Orakel, und IBMEs ist also auf vielen Plattformen erhältlich.[10]
C ++ wurde mit einer Ausrichtung auf Systemprogrammierung und eingebettet, ressourcenbezogene Software und große Systeme mit Leistung, Effizienz und Flexibilität des Gebrauchs als Design -Highlights.[11] C ++ wurde auch in vielen anderen Kontexten als nützlich befunden, wobei die wichtigsten Stärken der Softwareinfrastruktur und in ressourcenbezogenen Anwendungen sind.[11] einschließlich Desktop -Anwendungen, Videospiele, Server (z.B. E-Commerce, Web-Suche, oder Datenbanken) und leistungskritische Anwendungen (z. Telefonschalter oder Raumsonden).[12]
C ++ wird durch die standardisiert Internationale Standardisierungsorganisation (ISO) mit der neuesten Standardversion ratifiziert und von ISO im Dezember 2020 als veröffentlicht ISO/IEC 14882: 2020 (informell bekannt als C ++ 20).[13] Die C ++ - Programmiersprache wurde 1998 zunächst als standardisiert ISO/IEC 14882: 1998, was dann von der geändert wurde C ++ 03, C ++ 11, C ++ 14, und C ++ 17 Standards. Die jetzige C ++ 20 Standard ersetzt diese diese mit neuen Funktionen und einem vergrößerten Standardbibliothek. Vor der ersten Standardisierung im Jahr 1998 wurde C ++ durch Stroustrup bei entwickelt Bell Labs seit 1979 als Erweiterung der C Sprache; Er wollte eine effiziente und flexible Sprache, die C ähnelt, die ebenfalls zur Verfügung gestellt wurde hochrangige Merkmale Für Programmorganisation.[14] Seit 2012 hat C ++ einen dreijährigen Veröffentlichungsplan[15] mit C ++ 23 als der nächste geplante Standard.[16]
Geschichte
1979,, Bjarne Stroustrup, ein Dänisch Informatiker, begann zu arbeiten "C mit Klassen", der Vorgänger von C ++.[17] Die Motivation für die Schaffung einer neuen Sprache stammt aus Strousstrups Erfahrung in der Programmierung für seine Doktorarbeit. Stroustrup fand das Simula hatte Funktionen, die für große Softwareentwicklung sehr hilfreich waren, aber die Sprache war zu langsam für den praktischen Gebrauch BCPL war schnell, aber zu niedrig, um für eine große Softwareentwicklung geeignet zu sein. Als Stroustrup anfing zu arbeiten AT & T Bell LabsEr hatte das Problem, die zu analysieren Unix Kernel in Gedenken an verteiltes Computer. Als Stroustrup sich an seine Doktorarbeit erinnerte, machte er sich auf den Weg, um die zu verbessern C Sprache mit Simula-ähnliche Funktionen.[18] C wurde ausgewählt, weil es allgemein, schnell, tragbar und weit verbreitet war. Neben den Einflüssen von C und Simula beeinflussten auch andere Sprachen diese neue Sprache, einschließlich Algol 68, Ada, Clu und Ml.
Zunächst fügte Strousstrups "C with -Klassen" den C -Compiler CPRE, einschließlich des C -Compilers, hinzu Klassen, abgeleitete Klassen, Starke Typisierung, Einbindung und Standardargumente.[19]
1982 begann Strousstrup, einen Nachfolger von C mit Klassen zu entwickeln, den er "C ++" nannte (++
das sein Inkrementoperator in c) nach mehreren anderen Namen. Neue Funktionen wurden hinzugefügt, einschließlich Virtuelle Funktionen, Funktionsname und Bedienerüberlastung, Verweise, Konstanten, Typ-Safe-Speicherzuweisung von Typen (neu/löschen), verbesserte Typüberprüfung und Einzellinien-Kommentare im BCPL-Stil mit zwei Vorwärts-Schrägstrichen (//
). Darüber hinaus entwickelte Stroustrup einen neuen eigenständigen Compiler für C ++. CFRONT.
1984 implementierte Strousstrup die erste Stream -Eingangs-/Ausgabebibliothek. Die Idee, einen Ausgangsbetreiber anstelle einer benannten Ausgangsfunktion bereitzustellen, wurde von vorgeschlagen Doug McIlroy[1] (wer hatte zuvor vorgeschlagen UNIX Pipes).
1985 die erste Ausgabe von Die C ++ - Programmiersprache wurde veröffentlicht, was zur endgültigen Referenz für die Sprache wurde, da es noch keinen offiziellen Standard gab.[20] Die erste kommerzielle Umsetzung von C ++ wurde im Oktober desselben Jahres veröffentlicht.[17]
1989 wurde C ++ 2.0 veröffentlicht, gefolgt von der aktualisierten zweiten Ausgabe von Die C ++ - Programmiersprache 1991.[21] Neue Funktionen in 2.0 umfassten mehrere Vererbung, abstrakte Klassen, statische Mitgliedsfunktionen, Const -Mitgliedsfunktionenund geschützte Mitglieder. In 1990, Das kommentierte C ++ - Referenzhandbuch wurde publiziert. Diese Arbeit wurde zur Grundlage für den zukünftigen Standard. Spätere Funktionen enthalten Vorlagen, Ausnahmen, Namespaces, Neu Abgüsse, und ein Boolescher Typ.
Im Jahr 1998 wurde C ++ 98 veröffentlicht, was die Sprache und ein kleines Update standardisierte (ein kleines Update (C ++ 03) wurde 2003 veröffentlicht.
Nach C ++ 98 entwickelte sich C ++ relativ langsam, bis 2011 der C ++ 11 Standard wurde veröffentlicht, wobei zahlreiche neue Funktionen hinzugefügt wurden, die Standardbibliothek weiter vergrößert und C ++ - Programmierern mehr Einrichtungen zur Verfügung stellen. Nach einem Minderjährigen C ++ 14 Im Dezember 2014 veröffentlichtes Update wurden verschiedene Neuzugänge eingeführt in C ++ 17.[22] Nach Abschluss im Februar 2020,[23] Ein Entwurf des C ++ 20 -Standards wurde am 4. September 2020 genehmigt und am 15. Dezember 2020 offiziell veröffentlicht.[24][25]
Am 3. Januar 2018 wurde Stroustrup als Gewinner des 2018 der bekannt gegeben Charles Stark Draper -Preis Für Engineering "zur Konzeption und Entwicklung der C ++ - Programmiersprache".[26]
Ab 2022[aktualisieren] C ++ belegte den vierten Platz auf der TIOBE index, ein Maß für die Popularität von Programmiersprachen danach Python, C und Java.[27]
Etymologie
Laut Stroustrup "bedeutet der Name die evolutionäre Natur der Veränderungen von C".[28] Dieser Name wird Rick Mascitti (Mitte 1983) gutgeschrieben[19] und wurde erstmals im Dezember 1983 verwendet. Als Mascitti 1992 informell über die Benennung befragt wurde, gab er an, dass es in a gegeben wurde frech Geist. Der Name stammt von C's ++
Operator (die Schritte das Wert von a Variable) und eine gemeinsame Namenskonvention von "+", um ein erweitertes Computerprogramm anzugeben.
Während der Entwicklungsphase von C ++ wurde die Sprache als "neues C" und "C mit Klassen" bezeichnet.[19][29] Vor dem Erwerb des endgültigen Namens.
Philosophie
Während des gesamten Lebens von C ++ wurde seine Entwicklung und Evolution von einer Reihe von Prinzipien geleitet:[18]
- Es muss von tatsächlichen Problemen angetrieben werden und seine Funktionen sollten in realen Programmen sofort nützlich sein.
- Jedes Merkmal sollte implementierbar sein (mit einer einigermaßen offensichtlichen Möglichkeit, dies zu tun).
- Programmierer sollten frei sein, ihren eigenen Programmierstil auszuwählen, und dieser Stil sollte von C ++ vollständig unterstützt werden.
- Eine nützliche Funktion ist wichtiger, als jeden möglichen Missbrauch von C ++ zu verhindern.
- Es sollte Einrichtungen zur Organisation von Programmen in separate, genau definierte Teile und Einrichtungen zur Kombination separat entwickelter Teile bereitstellen.
- Keine implizite Verstöße gegen die Typ System (Aber erlauben Sie explizite Verstöße; dh diejenigen, die vom Programmierer ausdrücklich angefordert wurden).
- Benutzern erstellte Typen müssen die gleiche Unterstützung und Leistung wie eingebaute Typen haben.
- Unbenutzte Merkmale sollten nicht negativ auf erstellte ausführbare Ausführungen auswirken (z. B. bei niedrigerer Leistung).
- Unter C ++ sollte es keine Sprache geben (außer Montagesprache).
- C ++ sollte mit anderen bestehenden zusammenarbeiten Programmiersprachenanstatt ihre eigene und unvereinbar zu fördern Programmierumgebung.
- Wenn die Absicht des Programmierers unbekannt ist, erlauben Sie dem Programmierer, ihn durch manuelle Steuerung anzugeben.
Standardisierung
Jahr | C ++ Standard[30] | Umgangsprachlicher Name |
---|---|---|
1998 | ISO/IEC 14882: 1998[31] | C ++ 98 |
2003 | ISO/IEC 14882: 2003[32] | C ++ 03 |
2011 | ISO/IEC 14882: 2011[33] | C ++ 11, C ++ 0x |
2014 | ISO/IEC 14882: 2014[34] | C ++ 14, C ++ 1y |
2017 | ISO/IEC 14882: 2017[35] | C ++ 17, C ++ 1z |
2020 | ISO/IEC 14882: 2020[13] | C ++ 20, C ++ 2a |
C ++ wird durch a standardisiert ISO Arbeitsgruppe bekannt als als JTC1/SC22/WG21. Bisher hat es sechs Überarbeitungen des C ++ - Standards veröffentlicht und arbeitet derzeit an der nächsten Revision. C ++ 23.
1998 standardisierte die ISO -Arbeitsgruppe C ++ zum ersten Mal als ISO/IEC 14882: 1998, was informell bekannt ist als C ++ 98. Im Jahr 2003 veröffentlichte es eine neue Version des C ++ - Standards mit dem Namen ISO/IEC 14882: 2003, die in C ++ 98 identifizierte Probleme feststellten.
Die nächste wichtige Überarbeitung des Standards wurde informell als "C ++ 0x" bezeichnet, wurde jedoch erst 2011 veröffentlicht.[36] C ++ 11 (14882: 2011) beinhaltete viele Ergänzungen sowohl zur Kernsprache als auch zur Standardbibliothek.[33]
Im Jahr 2014, C ++ 14 (Auch als C ++ 1y bekannt) wurde als kleine Erweiterung auf freigegeben C ++ 11, mit hauptsächlich Fehlerbehebungen und kleinen Verbesserungen.[37] Der Entwurf internationaler Standard-Wahlverfahren, die Mitte August 2014 abgeschlossen haben.[38]
Nach C ++ 14 eine große Überarbeitung C ++ 17, informell bekannt als C ++ 1z, wurde vom ISO C ++ - Ausschuss Mitte Juli 2017 fertiggestellt und im Dezember 2017 genehmigt und veröffentlicht.[39]
Im Rahmen des Standardisierungsprozesses veröffentlicht ISO auch Technische Berichte und Spezifikationen:
- ISO/IEC TR 18015: 2006[40] Bei der Verwendung von C ++ in eingebetteten Systemen und auf Leistungsauswirkungen von C ++ - Sprach- und Bibliotheksfunktionen.
- ISO/IEC TR 19768: 2007[41] (auch bekannt als die C ++ technischer Bericht 1) auf Bibliothekserweiterungen, die hauptsächlich in integriert sind in C ++ 11,
- ISO/IEC TR 29124: 2010[42] auf besondere mathematische Funktionen, integriert in C ++ 17
- ISO/IEC TR 24733: 2011[43] an Dezimalerschwimmpunkt Arithmetik,
- ISO/IEC TS 18822: 2015[44] in der Standard -Dateisystembibliothek, integriert in C ++ 17
- ISO/IEC TS 19570: 2015[45] an parallel Versionen der Standardbibliotheksalgorithmen, integriert in C ++ 17
- ISO/IEC TS 19841: 2015[46] auf Software Transaktionsspeicher,
- ISO/IEC TS 19568: 2015[47] auf einer neuen Reihe von Bibliothekserweiterungen, von denen einige bereits integriert sind C ++ 17,
- ISO/IEC TS 19217: 2015[48] auf dem c ++ Konzepte, integriert in C ++ 20
- ISO/IEC TS 19571: 2016[49] auf den Bibliothekserweiterungen für die Parallelität, von denen einige bereits integriert sind C ++ 20
- ISO/IEC TS 19568: 2017[50] Auf einem neuen Satz von Allzweckbibliothekserweiterungen
- ISO/IEC TS 21425: 2017[51] auf den Bibliothekserweiterungen für Bereiche, integriert in C ++ 20
- ISO/IEC TS 22277: 2017[52] auf Coroutinen, integriert in C ++ 20
- ISO/IEC TS 19216: 2018[53] in der Netzwerkbibliothek
- ISO/IEC TS 21544: 2018[54] auf Modulen, integriert in C ++ 20
- ISO/IEC TS 19570: 2018[55] auf einer neuen Reihe von Bibliothekserweiterungen für die Parallelität
- ISO/IEC TS 23619: 2021[56] auf neue Erweiterungen zur Reflexion
Weitere technische Spezifikationen sind in der Entwicklung und anhängiger Genehmigung, einschließlich neuer Reihe von Genauigkeitserweiterungen.[57]
Sprache
Die C ++-Sprache verfügt über zwei Hauptkomponenten: eine direkte Zuordnung von Hardwarefunktionen, die hauptsächlich durch die C-Teilmenge bereitgestellt werden, und Zero-Overhead-Abstraktionen basierend auf diesen Zuordnungen. StrouStrup beschreibt C ++ als "eine leichte Abstraktionsprogrammiersprache [entworfen] zum Aufbau und die Verwendung effizienter und eleganter Abstraktionen";[11] Und "sowohl Hardware -Zugriff als auch Abstraktion anzubieten, ist die Grundlage für C ++. Es ist das, was sie effizient tun, von anderen Sprachen unterscheidet."[58]
C ++ erbt die meisten von Cs Syntax. Das Folgende ist die Version von Bjarne Stroustrup von der Hallo Weltprogramm das benutzt das C ++ Standardbibliothek Stream Facility, um eine Nachricht an zu schreiben Standardausgabe:[59][60][Anmerkung 1]
#enthalten int hauptsächlich() { std::Cout << "Hallo Welt!\n"; }
Objektspeicher
Wie in C unterstützt C ++ vier Arten von Arten von Speicherverwaltung: statische Speicherdauerobjekte, Objekte der Gewindespeicherdauer, automatische Speicherdauerobjekte und dynamische Speicherdauerobjekte.[61]
Statische Speicherdauerobjekte
Es werden zuvor statische Speicherdauerobjekte erstellt hauptsächlich()
wird eingegeben (siehe Ausnahmen unten) und in umgekehrter Reihenfolge der Schöpfung zerstört hauptsächlich()
Ausgänge. Die genaue Reihenfolge der Schöpfung wird nicht vom Standard festgelegt (obwohl es unten einige Regeln definiert sind), damit Implementierungen eine gewisse Freiheit bei der Organisation ihrer Implementierung ermöglichen. Formale haben Objekte dieser Art eine Lebensdauer, die "für die Dauer des Programms dauern".[62]
Statische Speicherdauerobjekte werden in zwei Phasen initialisiert. Erstens wird "statische Initialisierung" durchgeführt und nur nach Alle statische Initialisierung erfolgt, "Dynamische Initialisierung" wird durchgeführt. Bei der statischen Initialisierung werden alle Objekte zuerst mit Nullen initialisiert. Danach werden alle Objekte mit einer konstanten Initialisierungsphase mit dem konstanten Expression initialisiert (d. H. Variablen, die mit einem wörtlichen oder initialisiert wurden Constexpr
). Obwohl es im Standard nicht angegeben ist, kann die statische Initialisierungsphase zum Kompilierzeit abgeschlossen und in der Datenpartition der ausführbaren Datei gespeichert werden. Die dynamische Initialisierung beinhaltet die gesamte Objektinitialisierung über einen Konstruktor oder einen Funktionsaufruf (es sei denn, die Funktion ist mit markiert mit markiert Constexpr
in C ++ 11). Die dynamische Initialisierungsreihenfolge ist definiert als die Reihenfolge der Deklaration innerhalb der Kompilierungseinheit (d. H. Die gleiche Datei). Es werden keine Garantien über die Reihenfolge der Initialisierung zwischen Kompilierungseinheiten gewährt.
Fadenspeicherdauerobjekte
Variablen dieses Typs sind den statischen Speicherdauerobjekten sehr ähnlich. Der Hauptunterschied besteht darin, dass die Erstellungszeit kurz vor der Erstellung von Fäden liegt und die Zerstörung nach dem Verbinden des Fadens erfolgt.[63]
Automatische Speicherdauerobjekte
Die häufigsten variablen Typen in C ++ sind lokale Variablen in einer Funktion oder einem Block und temporären Variablen.[64] Das gemeinsame Merkmal über automatische Variablen ist, dass sie eine Lebensdauer haben, die sich auf den Umfang der Variablen beschränkt. Sie werden erstellt und potenziell in der Erklärung (siehe unten für Einzelheiten) initialisiert und in der zerstört umkehren Reihenfolge der Schöpfung, wenn das Zielfernrohr übrig bleibt. Dies wird durch Zuordnung auf dem implementiert Stapel.
Lokale Variablen werden erstellt, wenn der Ausführungspunkt den Deklarationspunkt übergeht. Wenn die Variable einen Konstruktor oder einen Initialisierer hat, wird dies verwendet, um den Anfangszustand des Objekts zu definieren. Lokale Variablen werden zerstört, wenn der lokale Block oder die Funktion, in der sie deklariert werden, geschlossen ist. C ++ - Zerstörer für lokale Variablen werden am Ende der Objektlebensdauer aufgerufen, die eine Disziplin für das automatische Ressourcenmanagement ermöglicht Raii, was in C ++ weit verbreitet ist.
Mitgliedervariablen werden erstellt, wenn das übergeordnete Objekt erstellt wird. Array -Mitglieder werden in der Reihenfolge von 0 bis zum letzten Mitglied des Arrays initialisiert. Mitgliedervariablen werden zerstört, wenn das übergeordnete Objekt in umgekehrter Reihenfolge der Schöpfung zerstört wird. d. H. Wenn das Elternteil ein "automatisches Objekt" ist, wird es zerstört, wenn es aus dem Geltungsbereich ausgeht, was die Zerstörung aller Mitglieder auslöst.
Temporäre Variablen werden als Ergebnis der Expressionsbewertung erstellt und zerstört, wenn die Aussage, die den Ausdruck enthält, vollständig bewertet wurde (normalerweise am ;
am Ende einer Erklärung).
Dynamische Speicherdauerobjekte
Diese Objekte haben eine dynamische Lebensdauer und können direkt mit einem Aufruf an erstellt werden new
und explizit mit einem Anruf zerstört delete
.[65] C ++ unterstützt auch Malloc
und frei
, von c, aber diese sind nicht mit kompatibel mit new
und delete
. Gebrauch von new
Gibt eine Adresse an den zugewiesenen Speicher zurück. Die C ++ - Kernrichtlinien empfehlen gegen die Verwendung new
direkt zum Erstellen dynamischer Objekte zugunsten von intelligenten Zeigern durch make_unique
für einzelne Eigentümer und make_shared
als Referenzzahl mehrerer Eigentum,[66] die in C ++ 11 eingeführt wurden.
Vorlagen
C ++ - Vorlagen ermöglichen generische Programmierung. C ++ unterstützt Funktion, Klasse, Alias und variable Vorlagen. Vorlagen können durch Typen, Kompilierungszeitkonstanten und andere Vorlagen parametrisiert werden. Vorlagen werden von implementiert von Instanziierung Bei Kompilierungszeit. Um eine Vorlage zu instanziieren, ersetzen Compiler bestimmte Argumente für die Parameter einer Vorlage, um eine konkrete Funktion oder eine Klasseninstanz zu generieren. Einige Substitutionen sind nicht möglich; Diese werden durch eine von der Phrase beschriebene Überlastauflösungspolitik "beseitigt"Substitutionsfehler ist kein Fehler"(Sfinae). Vorlagen sind ein leistungsstarkes Werkzeug, für das verwendet werden kann generische Programmierung, Vorlage Metaprogrammierungund Codeoptimierung, aber diese Leistung impliziert Kosten. Die Verwendung von Vorlagen kann die Codegröße erhöhen, da jede Vorlage eine Kopie des Vorlagencodes erstellt: eine für jeden Satz von Vorlagenargumenten. Dies ist jedoch dieselbe oder kleinere Code, die generiert werden würde, wenn der Code von Hand geschrieben würde.[67] Dies steht im Gegensatz zu Laufzeitgenerika in anderen Sprachen (z. B.,, Java) Wo bei der Kompilierung der Art der Typ gelöscht und ein einzelner Vorlagenkörper erhalten bleibt.
Vorlagen unterscheiden sich von Makros: Während beide Sprachfunktionen für Kompilierzeit eine bedingte Zusammenstellung ermöglichen, sind Vorlagen nicht auf lexikalische Substitution beschränkt. Vorlagen sind sich des Semantik- und Typsystems ihrer Begleitsprache sowie der Definitionen für Kompilierzeittypen bewusst und können hochrangige Operationen durchführen, einschließlich programmatischer Durchflussregelung, basierend auf der Bewertung streng typisch überprüfter Parameter. Makros sind in der Lage, eine konditionelle Kontrolle über die Kompilierung basierend auf vorgegebenen Kriterien zu kontrollieren, können jedoch keine neuen Typen, wiederholt oder nicht auf die Typbewertung durchführen, und sind in der Tat auf die Vorab-Text-Substitution und Text-Inklusion/-ausschluss beschränkt. Mit anderen Worten, Makros können den Kompilierungsfluss basierend auf vordefinierten Symbolen steuern, können jedoch im Gegensatz zu Vorlagen unabhängig voneinander neue Symbole instanziieren. Vorlagen sind ein Werkzeug für statische Polymorphismus (siehe unten) und generische Programmierung.
Darüber hinaus sind Vorlagen ein Kompilierungs-Zeit-Mechanismus in C ++, dh dh Turing-Complete, was bedeutet, dass jede Berechnung, die von einem Computerprogramm exprimiert werden kann, in irgendeiner Form von a berechnet werden kann Template Metaprogramm vor der Laufzeit.
Zusammenfassend ist eine Vorlage eine parametrisierte Funktion oder Klasse für Kompilierzeit, ohne dass die spezifischen Argumente zur Instanziierung verwendet werden. Nach der Instanziierung entspricht der resultierende Code dem Code, der speziell für die bestandenen Argumente geschrieben wurde. Auf diese Weise bieten Vorlagen eine Möglichkeit, generische, allgemein anwendbare Aspekte von Funktionen und Klassen (in Vorlagen codiert) aus spezifischen Aspekten (in Template -Parametern codiert) zu entkoppeln, ohne die Leistung aufgrund der Abstraktion zu beeinträchtigen.
Objekte
C ++ führt ein Objekt orientierte Programmierung (Oop) Merkmale für C. Es bietet es Klassen, die die vier in OOP (und einige Nichtoop-) Sprachen üblicherweise vorhandenen Merkmale liefern: Abstraktion, Verkapselung, Nachlass, und Polymorphismus. Ein Unterscheidungsmerkmal von C ++ - Klassen im Vergleich zu Klassen in anderen Programmiersprachen ist die Unterstützung für deterministisch Zerstörer, was wiederum Unterstützung für die unterstützen Ressourcenerwerb ist die Initialisierung (Raii) Konzept.
Verkapselung
Verkapselung ist das Verstecken von Informationen, um sicherzustellen, dass Datenstrukturen und Bediener als beabsichtigt verwendet werden und das Verwendungsmodell für den Entwickler offensichtlicher werden. C ++ bietet die Möglichkeit, Klassen und Funktionen als primäre Einkapselungsmechanismen zu definieren. Innerhalb einer Klasse können Mitglieder als öffentlich, geschützt oder privat erklärt werden, um die Kapselung explizit durchzusetzen. Ein öffentliches Mitglied der Klasse ist für jede Funktion zugänglich. Ein privates Mitglied ist nur für Funktionen zugänglich, die Mitglieder dieser Klasse sind, sowie für Funktionen und Klassen, die ausdrücklich die Erlaubnis zur Zugriff durch die Klasse ("Freunde") erteilt haben. Ein geschütztes Mitglied ist für Mitglieder von Klassen zugänglich, die neben der Klasse selbst und allen Freunden von der Klasse erben.
Das objektorientierte Prinzip gewährleistet die Einkapselung aller und nur der Funktionen, die auf die interne Darstellung eines Typs zugreifen. C ++ unterstützt dieses Prinzip über Mitgliederfunktionen und Freundenfunktionen, erzwingt es jedoch nicht. Programmierer können Teile oder die gesamte Darstellung eines Typs als öffentlich erklären, und sie dürfen öffentliche Einrichtungen nicht Teil der Darstellung eines Typs machen. Daher unterstützt C ++ nicht nur eine objektorientierte Programmierung, sondern auch andere Zersetzungsparadigmen wie z. Modulare Programmierung.
Es wird allgemein als gute Praxis angesehen, alle zu machen Daten privat oder geschützt, und um nur die Funktionen zu veröffentlichen, die Teil einer minimalen Schnittstelle für Benutzer der Klasse sind. Dies kann die Details der Datenimplementierung verbergen, sodass der Designer die Implementierung später grundlegend ändern kann, ohne die Schnittstelle in irgendeiner Weise zu ändern.[68][69]
Nachlass
Nachlass Ermöglicht ein Datentyp, Eigenschaften anderer Datentypen zu erwerben. Erbschaft von a Basisklasse kann als öffentlich, geschützt oder privat erklärt werden. Dieser Zugriffsspezifizierer bestimmt, ob nicht verwandte und abgeleitete Klassen auf die ererbten öffentlichen und geschützten Mitglieder der Basisklasse zugreifen können. Nur die öffentliche Erbschaft entspricht dem, was normalerweise mit "Vererbung" gemeint ist. Die beiden anderen Formen werden viel seltener verwendet. Wenn der Zugriffsspezifizierer weggelassen wird, erbt eine "Klasse" privat, während eine "Struktur" öffentlich erbt. Basisklassen können als virtuell deklariert werden; das nennt man Virtuelle Vererbung. Virtuelle Vererbung stellt sicher, dass nur eine Instanz einer Basisklasse in der Vererbungsgrafik vorhanden ist und einige der Unklarheitsprobleme der multiplen Vererbung vermeidet.
Mehrfacherbe ist eine C ++ - Funktion, mit der eine Klasse von mehr als einer Basisklasse abgeleitet werden kann; Dies ermöglicht eine ausgefeiltere Vererbungsbeziehungen. Zum Beispiel kann eine "fliegende Katze" -Klasse sowohl von "Katze" als auch von "fliegendem Säugetier" erben. Einige andere Sprachen, wie z. C# oder Javaetwas Ähnliches (wenn auch begrenzter) erreichen, indem er die Vererbung von mehreren zulässt Schnittstellen Die Anzahl der Basisklassen auf eins auf eine Einschränkung (Schnittstellen geben im Gegensatz zu Klassen nur Erklärungen von Mitgliedsfunktionen, keine Implementierung oder Mitgliederdaten). Eine Schnittstelle wie in C# und Java kann in C ++ als eine Klasse definiert werden Abstrakte Basisklasse oder "ABC". Die Mitgliedsfunktionen einer solchen abstrakten Basisklasse sind normalerweise explizit in der abgeleiteten Klasse definiert und nicht implizit vererbt. C ++ Virtuelle Vererbung zeigt eine Mehrdeutigkeitsauflösung -Funktion namens Dominanz.
Operatoren und Bedienerüberlastung
Operator | Symbol |
---|---|
Bereichsauflösungsoperator | :: |
Bedingender Bediener | ?: |
Punktbetreiber | . |
Mitgliedsauswahlbetreiber | .* |
"Größe von" Operator | sizeof |
"Typid" Operator | typeid |
C ++ liefert mehr als 35 Operatoren, die grundlegende Arithmetik, Bitmanipulation, Indirektion, Vergleiche, logische Operationen und andere abdecken. Fast alle Betreiber können sein überladen Für benutzerdefinierte Typen mit einigen bemerkenswerten Ausnahmen wie dem Zugriff auf die Mitglieder (.
und .*
) sowie der bedingte Bediener. Der reichhaltige Satz überladbarer Bediener ist von zentraler Bedeutung, um benutzerdefinierte Typen in C ++ eingebauter Typen erscheinen zu lassen.
Überladbare Operatoren sind auch ein wesentlicher Bestandteil vieler fortschrittlicher C ++ - Programmierungstechniken, wie z. Smart Zeiger. Überlastung eines Bedieners ändert weder die Vorrangerberechnungen, an denen der Bediener beteiligt ist, noch ändert er die Anzahl der Operanden, die der Betreiber verwendet (jeder Operand kann jedoch vom Bediener ignoriert werden, obwohl er vor der Ausführung bewertet wird). Überladen "&&
" und "||
"Betreiber verlieren ihre Kurzschlussbewertung Eigentum.
Polymorphismus
Polymorphismus Ermöglicht eine gemeinsame Schnittstelle für viele Implementierungen und für Objekte, unter verschiedenen Umständen unterschiedlich zu handeln.
C ++ unterstützt verschiedene Arten von statisch (aufgelöst Kompilierungszeit) und dynamisch (aufgelöst Laufzeit) Polymorphismen, unterstützt durch die oben beschriebenen Sprachmerkmale. Kompilierungs-Zeit-Polymorphismus erlaubt bestimmte Laufzeitentscheidungen nicht zu Laufzeitpolymorphismus in der Regel eine Leistungsstrafe.
Statischer Polymorphismus
Funktion Überlastung Ermöglicht Programmen, mehrere Funktionen mit demselben Namen zu deklarieren, jedoch mit unterschiedlichen Argumenten (d. H. ad hoc Polymorphismus). Die Funktionen unterscheiden sich durch die Anzahl oder die Art ihrer formale Parameter. Daher kann der gleiche Funktionsname je nach Kontext, in dem er verwendet wird, unterschiedliche Funktionen beziehen. Der von der Funktion zurückgegebene Typ wird nicht verwendet, um überlastete Funktionen zu unterscheiden, und unterschiedliche Rückgabetypen würden zu einer Kompilierungs-Zeit-Fehlermeldung führen.
Bei der Erklärung einer Funktion kann ein Programmierer für einen oder mehrere Parameter a angeben Standardwert. Dies ermöglicht es, dass die Parameter mit Standardeinstellungen optional weggelassen werden, wenn die Funktion aufgerufen wird. In diesem Fall werden die Standardargumente verwendet. Wenn eine Funktion mit weniger Argumenten aufgerufen wird, als es deklarierte Parameter gibt, werden explizite Argumente mit den Parametern in der Reihenfolge von links nach rechts angepasst, wobei alle unübertroffenen Parameter am Ende der Parameterliste ihre Standardargumente zugewiesen werden. In vielen Fällen ist die Angabe von Standardargumenten in einer einzigen Funktionserklärung der Bereitstellung überladener Funktionsdefinitionen mit unterschiedlichen Parametern vorzuziehen.
Vorlagen In C ++ bieten ein ausgefeilter Mechanismus zum Schreiben generischer, polymorpher Code (d. H. parametrischer Polymorphismus). Insbesondere durch die Seltsamerweise wiederkehrendes VorlagenmusterEs ist möglich, eine Form des statischen Polymorphismus zu implementieren, die die Syntax für überschreibende virtuelle Funktionen genau nachahmt. Weil C ++-Vorlagen vom Typ Typ sind und Turing-CompleteSie können auch verwendet werden, um den Compiler rekursive Bedingungen auflösen zu lassen und wesentliche Programme durch zu generieren Vorlage Metaprogrammierung. Im Gegensatz zu einer Meinung generiert der Vorlagencode nach Kompilierung keinen Massencode mit den richtigen Compiler -Einstellungen.[67]
Dynamischer Polymorphismus
Nachlass
Variable Zeiger und Verweise auf einen Basisklassentyp in C ++ können sich auch auf Objekte aller abgeleiteten Klassen dieses Typs beziehen. Auf diese Weise können Arrays und andere Arten von Containern Zeiger auf Objekte unterschiedlicher Typen halten (Referenzen können nicht direkt in Containern gehalten werden). Dies ermöglicht den dynamischen (Laufzeit-) Polymorphismus, bei dem sich die verwiesenen Objekte je nach ihren (tatsächlichen, abgeleiteten) Typen unterschiedlich verhalten können.
C ++ liefert auch die dynamic_cast
Der Operator, mit dem Code sicher versucht, ein Objekt über einen Basisreferenz/Zeiger in einen abgeleiteten Typ zu konvertieren: Niederschlag. Das versuchen ist notwendig, da man oft nicht weiß, auf welchen abgeleiteten Typ verwiesen wird. (UpcastDie Konvertierung in einen allgemeineren Typ kann jederzeit über die Kompilierung überprüft/durchgeführt werden static_cast
, wie in der Schnittstelle der abgeleiteten Klasse für Ahnenklassen für alle Anrufer sichtbar sind.) dynamic_cast
beruht auf Laufzeitinformationen (RTTI), Metadaten im Programm, das die Differenzierung von Typen und ihre Beziehungen ermöglicht. Wenn ein dynamic_cast
zu einem Zeiger fällt aus, das Ergebnis ist das nullptr
Konstant, während das Ziel eine Referenz ist (die nicht null sein kann), macht der Guss eine Ausnahme. Objekte bekannt Von einem bestimmten abgeleiteten Typ zu sein, kann mit dem mit dem mitgegossen werden static_cast
Umgehung von RTTI und der sicheren Laufzeit-Überprüfung von dynamic_cast
Dies sollte also nur verwendet werden, wenn der Programmierer sehr zuversichtlich ist, dass die Besetzung immer gültig ist und immer gültig ist.
Virtuelle Mitgliedsfunktionen
Normalerweise, wenn eine Funktion in einer abgeleiteten Klasse überschreiben Eine Funktion in einer Basisklasse, die aufgerufene Funktion wird durch den Typ des Objekts bestimmt. Eine bestimmte Funktion wird überschrieben, wenn es keinen Unterschied in der Anzahl oder der Art der Parameter zwischen zwei oder mehr Definitionen dieser Funktion gibt. Zum Kompilierungszeitpunkt ist es daher möglicherweise nicht möglich, den Typ des Objekts und daher die richtige Funktion zu bestimmen, die nur einen Zeiger der Basisklasse bei der Basisklasse erfolgt. Die Entscheidung wird daher bis zur Laufzeit gestrichen. Das nennt man Dynamischer Versand. Virtuelle Mitgliedsfunktionen oder Methoden[70] Lassen Sie die spezifischste Implementierung der Funktion gemäß dem tatsächlichen Laufzeittyp des Objekts aufgerufen. In C ++ - Implementierungen wird dies üblicherweise verwendet Virtuelle Funktionstabellen. Wenn der Objekttyp bekannt ist, kann dies durch Vorbereitung a umgangen werden Vollqualifizierter Klassenname Vor dem Funktionsaufruf, aber im Allgemeinen werden Anrufe zu virtuellen Funktionen zur Laufzeit gelöst.
Zusätzlich zu Standard -Mitgliedsfunktionen können Operator -Überladungen und -Destruktoren virtuell sein. Eine auf der praktische Erfahrung basierende ungenaue Regel besagt, dass der Destruktor, wenn eine Funktion in der Klasse virtuell ist, ebenfalls sein sollte. Da die Art eines Objekts bei seiner Erstellung zum Kompilierzeit bekannt ist, können Konstruktoren und nach Extensionskopiekonstruktoren nicht virtuell sein. Trotzdem kann eine Situation auftreten, in der eine Kopie eines Objekts erstellt werden muss, wenn ein Zeiger auf ein abgeleitetes Objekt als Zeiger an ein Basisobjekt übergeben wird. In einem solchen Fall besteht eine gemeinsame Lösung darin, a zu erstellen clone()
(oder ähnliche) virtuelle Funktion, die eine Kopie der abgeleiteten Klasse erstellt und zurückgibt, wenn sie aufgerufen wird.
Eine Mitgliedsfunktion kann auch "rein virtuell" gemacht werden = 0
nach der abschließenden Klammer und vor dem Semikolon. Eine Klasse, die eine reine virtuelle Funktion enthält abstrakte Klasse. Objekte können nicht aus einer abstrakten Klasse erstellt werden; Sie können nur abgeleitet werden. Jede abgeleitete Klasse erbt die virtuelle Funktion als rein und muss eine nicht-pure-Definition (und alle anderen reinen virtuellen Funktionen) liefern, bevor Objekte der abgeleiteten Klasse erstellt werden können. Ein Programm, das versucht, ein Objekt einer Klasse mit einer reinen virtuellen Mitgliedsfunktion oder einer reinen virtuellen Mitgliedsfunktion zu erstellen, ist schlecht geformt.
Lambda -Ausdrücke
C ++ bietet Unterstützung für Anonyme Funktionen, auch bekannt als Lambda -Ausdrücke, mit der folgenden Form:
[Erfassung] (Parameter) -> return_type { function_body }
Da C ++ 20, können Sie Vorlagenparameter auf ein Lambda ohne das Schlüsselwort schreiben template
:
[Erfassung]<template_parameters>(Parameter) -> return_type { function_body }
Wenn die Lambda keine Parameter nimmt und kein Rückgabetyp oder andere Spezifizierer verwendet werden, kann die () weggelassen werden, dh,:
[Erfassung] { function_body }
Der Rückgabetyp eines Lambda -Ausdrucks kann nach Möglichkeit automatisch abgeleitet werden, z. B.:
[] (int x, int y) { Rückkehr x + y; } // gefolgert [] (int x, int y) -> int { Rückkehr x + y; } // explizit
Das [capture]
Liste unterstützt die Definition von Schließungen. Solche Lambda -Ausdrücke sind im Standard als definiert als syntethischer Zucker für einen unbenannten Funktionsobjekt.
Ausnahmebehandlung
Die Ausnahmebehandlung wird verwendet, um die Existenz eines Laufzeitproblems oder -fehlers zu kommunizieren, von dem es erkannt wurde, wo das Problem behandelt werden kann.[71] Dies ermöglicht dies in einheitlicher Weise und getrennt vom Hauptcode, während alle Fehler festgestellt werden.[72] Sollte ein Fehler auftreten, wird eine Ausnahme ausgelöst (erhöht), was dann vom nächsten geeigneten Ausnahmebehandler gefangen wird. Die Ausnahme bewirkt, dass der aktuelle Bereich ausgeht, und auch jeden äußeren Bereich (Ausbreitung), bis ein geeigneter Handler gefunden wird, der wiederum die Zerstörer aller Objekte in diesen ausgelassenen Bereichen ruft.[73] Gleichzeitig wird eine Ausnahme als Objekt dargestellt, das die Daten zum erkannten Problem trägt.[74]
Einige C ++ - Style Guides wie Google,[75] LLVMs,[76] und Qt's[77] verbieten die Verwendung von Ausnahmen.
Der ausnahmslos verursachende Code wird in a platziert try
Block. Die Ausnahmen werden in separat behandelt catch
Blöcke (die Handler); jeder try
Block kann mehrere Ausnahmebehandler haben, da er im folgenden Beispiel sichtbar ist.[78]
#enthalten #enthalten #enthalten int hauptsächlich() { Versuchen { std::Vektor<int> vec{3, 4, 3, 1}; int i{vec.bei(4)}; // macht eine Ausnahme, std :: out_of_range (Indexierung für VEC ist von 0-3 nicht 1-4) } // Ein Ausnahmebehandler fängt Std :: out_of_range, der von vec.at (4) geworfen wird Fang (std::außer Reichweite &e) { std::Cerr << "Zugriff auf ein nicht existierendes Element:" << e.was() << '\n'; } // Um andere Standard -Bibliotheksausnahmen zu fangen (sie stammen aus std :: Ausnahme) Fang (std::Ausnahme &e) { std::Cerr << "Ausnahme geworfen:" << e.was() << '\n'; } // fangen Sie keine anerkannten Ausnahmen (d. H. solche, die nicht aus std :: Ausnahme abgeben) Fang (...) { std::Cerr << "Ein tödlicher Fehler\n"; } }
Es ist auch möglich, Ausnahmen zielgerichtet zu erhöhen, indem Sie die verwenden throw
Stichwort; Diese Ausnahmen werden auf die übliche Weise behandelt. In einigen Fällen können Ausnahmen aus technischen Gründen nicht verwendet werden. Ein solches Beispiel ist ein kritischer Bestandteil eines eingebetteten Systems, bei dem jeder Betrieb innerhalb einer bestimmten Zeit garantiert werden muss. Dies kann nicht mit Ausnahmen bestimmt werden, da keine Werkzeuge vorhanden sind, um die maximale Zeit zu bestimmen, die für eine Ausnahme behandelt werden muss.[79]
nicht wie Signalhandhabung, in dem die Handhabungsfunktion vom Ausfallspunkt aufgerufen wird, verlässt das Ausnahmebehandlung aus dem aktuellen Umfang, bevor der Fangblock eingegeben wird. Dies kann sich in der aktuellen Funktion oder einer der vorherigen Funktionen auf dem Stapel befinden.
Aufzählte Typen
C ++ verfügt über Aufzählungstypen, die direkt von C von C geerbt werden und hauptsächlich wie diese arbeiten, außer dass eine Aufzählung ein realer Typ in C ++ ist, der zusätzliche Kompilierungs-Zeit-Überprüfung ergibt. Auch (wie bei Strukturen) das C ++ Auflauf
Schlüsselwort wird automatisch mit a kombiniert Typedef, so dass anstatt den Typ zu benennen Auflaufname
Nennen Sie es einfach Name
. Dies kann in C unter Verwendung eines Typedefs simuliert werden: typedef enum {Value1, Value2} name;
C ++ 11 Bietet auch eine zweite Art von Aufzählung, genannt a Aufzählung abgeschrieben. Dies sind Typ-Safe: Die Aufzähler werden nicht implizit in einen Ganzzahltyp konvertiert. Dies ermöglicht dies unter anderem, das I/A -Streaming für den Zählertyp zu definieren. Ein weiteres Merkmal von Scoped -Aufzählungen besteht darin, dass die Aufzähler nicht auslaufen. Daher erfordert die Verwendung des Namens der Aufzählung ein Präfixen (z. B.,, Farbe Rot
für den ersten Aufzähler im Beispiel unten), es sei denn a Verwenden von Enum
Erklärung (eingeführt in C ++ 20) wurde verwendet, um die Aufzähler in den aktuellen Bereich zu bringen. Eine Scoped -Aufzählung wird durch die Phrase angegeben Auflaufklasse
(oder Enum Struct
). Zum Beispiel:
Auflauf Klasse Farbe {Rot, Grün, Blau};
Das zugrunde liegender Typ einer Aufzählung ist ein implementierungsdefinierter Integralyp, der groß genug ist, um alle aufzähligen Werte zu halten. Es muss nicht der kleinstmögliche Typ sein. Der zugrunde liegende Typ kann direkt angegeben werden, wodurch "Vorwärtsdeklarationen" von Aufzählungen ermöglicht werden:
Auflauf Klasse Farbe : lang {Rot, Grün, Blau}; // muss in Größe und Speicherlayout "Long" passen Auflauf Klasse Formen : verkohlen; // Vorwärtsdeklaration. Wenn später Werte definiert sind, die nicht in 'char' passen, ist es ein Fehler.
Standardbibliothek
Das c ++ Standard besteht aus zwei Teilen: der Kernsprache und der Standardbibliothek. C ++ - Programmierer erwarten die letzteren bei jeder wichtigen Implementierung von C ++[klären]; Es enthält aggregierte Typen (Vektoren, Listet, Karten, Sets, Warteschlangen, Stapel, Arrays, Tupel), Algorithmen (finden, für jeden, binäre Suche, Random_shuffle usw.), Eingabe-/Ausgabeeinrichtungen (iostream, zum Lesen und Schreiben von Konsolen und Dateien), Dateisystembibliothek, Lokalisierungsunterstützung, Smart Zeiger Für automatische Speicherverwaltung, regulären Ausdruck Unterstützung, Multi-Threading Bibliothek, Atomikunterstützung (so dass eine Variable von höchstens einen Thread gleichzeitig ohne externe Synchronisation gelesen oder geschrieben werden kann), Zeitversorger (Messung, Aktuelle Zeit usw. T verwenden C ++ Ausnahmen in C ++ - Ausnahmen, a Zufallszahlengenerator und eine leicht modifizierte Version der C Standardbibliothek (Damit es das C ++ - Typ -System entspricht).
Ein großer Teil der C ++ - Bibliothek basiert auf dem Standard -Vorlagenbibliothek (STL). Nützliche Tools, die vom STL bereitgestellt werden Behälter als die Sammlungen von Objekten (wie z. Vektoren und Listen), Iteratoren die Array-ähnlichen Zugriff auf Behälter und Behälter bieten, und Algorithmen das führt Operationen wie Suche und Sortierung aus.
Darüber hinaus (multi) Karten (assoziative Arrays) und (multi) Sätze werden bereitgestellt, die alle kompatible Schnittstellen exportieren. Verwenden von Vorlagen ist es daher möglich, generische Algorithmen zu schreiben, die mit einem beliebigen Container oder einer von Iteratoren definierten Sequenz arbeiten. Wie in C, die Merkmale des Bibliothek werden durch die Verwendung der zugegriffen #include
Richtlinie Einzuschließen a Standard -Header. Das C ++ Standardbibliothek Bietet 105 Standard -Header, von denen 27 veraltet sind.
Der Standard enthält die STL, die ursprünglich von entworfen wurde von Alexander Stepanov, der viele Jahre lang mit generischen Algorithmen und Behältern experimentierte. Als er mit C ++ anfing, fand er schließlich eine Sprache, in der es möglich war, generische Algorithmen (z. B. STL-Sortierung) zu erstellen, die noch besser abschneiden als beispielsweise die C-Standardbibliothek-QSORT, dank C ++- Funktionen wie die Verwendung von Inline und Kompilieren- Zeitbindung statt Funktionszeiger. Der Standard bezeichnet ihn nicht als "STL", da er lediglich Teil der Standardbibliothek ist, aber der Begriff wird immer noch weit verbreitet, um ihn von der übrigen Standardbibliothek zu unterscheiden (Eingangs-/Ausgangsströme, Internationalisierung, Diagnostik, Die C -Bibliotheksuntergruppe usw.).[80]
Die meisten und alle wichtigen C ++-Compiler bieten eine Standard-Implementierung der C ++-Standardbibliothek.
C ++ - Kernrichtlinien
Die C ++ - Kernrichtlinien[81] sind eine Initiative, angeführt von Bjarne Strousstrup, dem Erfinder von C ++, und Herb Sutter, dem Convener und Stuhl der C ++ ISO -Arbeitsgruppe, um Programmierern zu helfen und um Entwicklern von Compilern und statischen Überprüfungswerkzeugen zu helfen, Regeln für das Fangen von schlechten Programmierpraktiken zu erstellen.
Das Hauptziel ist es, typ- und ressourcensichere C ++ effizient und konsequent zu schreiben.
Die Kernrichtlinien wurden bekannt gegeben[82] in der Eröffnungskultivität bei CPPCON 2015.
Die Richtlinien werden von der Guideline Support Library (GSL) begleitet.[83] Ein Header nur Bibliothek mit Typen und Funktionen zur Implementierung der Kernrichtlinien und statischen Prüfer -Tools zur Durchsetzung von Richtlinienregeln.[84]
Kompatibilität
Um Compiler -Anbieter mehr Freiheit zu geben, beschloss das C ++ - Standards -Komitee, die Umsetzung von nicht zu diktieren Nennen Sie Mangling, Ausnahmebehandlungund andere implementierungsspezifische Funktionen. Der Nachteil dieser Entscheidung ist das Objektcode produziert von verschiedenen Compiler wird voraussichtlich unvereinbar sein. Es gab jedoch Versuche, Compiler für bestimmte Maschinen zu standardisieren oder Betriebssysteme (Zum Beispiel C ++ ABI),[85] obwohl sie jetzt weitgehend aufgegeben zu sein scheinen.
Mit c
C ++ wird oft als Superset von angesehen C Aber das ist nicht streng wahr.[86] Die meisten C -Code können leicht in C ++ korrekt erfasst werden, aber es gibt einige Unterschiede, die dazu führen, dass ein gültiger C -Code in C ++ ungültig ist oder sich unterschiedlich verhält. Zum Beispiel ermöglicht C eine implizite Konvertierung von void*
an andere Zeigertypen, aber C ++ nicht (aus Sicherheitsgründen vom Typ Typ). Außerdem definiert C ++ viele neue Schlüsselwörter, wie z. new
und class
, die in einem C -Programm als Kennung (z. B. Variablennamen) verwendet werden können.
Einige Inkompatibilitäten wurden durch die Überarbeitung des C -Standards von 1999 entfernt (C99), was jetzt C ++ - Funktionen wie Zeilenkommentare unterstützt (z. B. Zeilenkommentare (//
) und Deklarationen mit Code gemischt. Auf der anderen Seite führte C99 eine Reihe neuer Funktionen ein, die C ++ nicht unterstützte, die in C ++ nicht kompatibel oder überflüssig waren, wie z. Arrays variabler Länge, native komplexe Zahlentypen (jedoch die, die std::complex
Die Klasse in der C ++-Standardbibliothek bietet ähnliche Funktionen, obwohl nicht codemompatibel), benannte Initialisierer, zusammengesetzte Literale, und die restrict
Stichwort.[87] Einige der C99-Einrichtungsfunktionen wurden in die nachfolgende Version des C ++-Standards aufgenommen. C ++ 11 (von denen, die nicht überflüssig waren).[88][89][90] Der C ++ 11 -Standard führt jedoch neue Inkompatibilitäten ein, z.
Um C- und C ++ - Code zu haben, muss jede Funktionserklärung oder Definition, die sowohl in C als auch in C ++ verwendet werden kann/verwendet werden, mit C -Verknüpfung deklariert werden, indem sie in einen platziert werden extern "C" {/*...*/}
Block. Eine solche Funktion beruht möglicherweise nicht auf Funktionen, je nachdem Nennen Sie Mangling (d. H. Funktion Überladen).
Kritik
Trotz seiner weit verbreiteten Akzeptanz haben einige bemerkenswerte Programmierer die C ++ - Sprache einschließlich kritisiert, einschließlich Linus Torvalds,[91] Richard Stallman,[92] Joshua Bloch, Ken Thompson[93][94][95] und Donald Knuth.[96][97]
Einer der am häufigsten kritisierten Punkte von C ++ ist die wahrgenommene Komplexität als Sprache, mit der Kritik, dass eine große Anzahl nicht-orthogonaler Merkmale in der Praktik . Wie zum Ausdruck Joshua Bloch:
Ich denke, C ++ wurde weit über seine Komplexitätsschwelle hinausgedrängt, und dennoch programmieren viele Menschen es. Aber was Sie tun, ist, dass Sie die Menschen zwingen, es zu untergruppen. Fast jeder Laden, von dem ich kenne, dass C ++ verwendet wird, sagt: "Ja, wir verwenden C ++, aber wir machen keine Erbschaft der Mehrfachimplementierung und verwenden keine Überlastung des Bedieners." Es gibt nur eine Reihe von Funktionen, die Sie nicht verwenden werden, da die Komplexität des resultierenden Code zu hoch ist. Und ich denke nicht, dass es gut ist, wenn Sie damit beginnen müssen. Sie verlieren diese Programmierer -Portabilität, wo jeder kann Lesen Sie den Code aller anderen, was ich für eine gute Sache halte.
Donald Knuth (1993, kommentiert vor Standard C ++), der sagte über Edsger Dijkstra Das "an das Programmieren in C ++" würde ihn physisch krank machen ":[96][97]
Das Problem, das ich heute mit ihnen habe, ist, dass ... C ++ zu kompliziert ist. Im Moment ist es für mich unmöglich, tragbare Code zu schreiben, von dem ich glaube, dass es auf vielen verschiedenen Systemen funktioniert, es sei denn, ich vermeide alle exotischen Merkmale. Immer wenn die C ++ - Sprachdesigner zwei konkurrierende Ideen hatten, wie sie ein Problem lösen sollten, sagten sie "OK, wir werden beide machen". Die Sprache ist also zu barock für meinen Geschmack.
Ken Thompson, der ein Kollege von Stroustrup bei Bell Labs war, gibt seine Einschätzung an:[94][95]
Es hat sicherlich seine guten Punkte. Aber im Großen und Ganzen denke ich, dass es eine schlechte Sprache ist. Es macht viele Dinge halb gut und es ist nur ein Müllhaufen von Ideen, die sich gegenseitig ausschließen. Jeder, den ich kenne, ob persönlich oder Unternehmen, wählt eine Untergruppe aus und diese Teilmengen sind unterschiedlich. Es ist also keine gute Sprache, einen Algorithmus zu transportieren - um zu sagen: "Ich habe ihn hier geschrieben, nimm ihn." Es ist viel zu groß, viel zu komplex. Und es ist offensichtlich Erbaut von einem Komitee. StrouStrup setzte sich jahrelang und jahrelang ein, weit über jegliche technische Beiträge hinaus, die er in die Sprache geleistet hat, um sie zu übernehmen und zu verwenden. Und er leitete alle Standardkomitees mit einer Peitsche und einem Stuhl. Und er sagte "Nein" zu niemandem. Er stellte jedes Feature in diese Sprache ein, die jemals existierte. Es war nicht sauber gestaltet - es war nur die Vereinigung von allem, was kam. Und ich denke, es hat drastisch darunter gelitten.
Jedoch Brian Kernighan, auch ein Kollege bei Bell Labs, bestreitet diese Einschätzung:[98]
C ++ war enorm einflussreich. ... Viele Leute sagen Es sind tatsächlich Menschen, die versuchen, reale Probleme zu lösen. Jetzt sind viele Programme, die wir heute für selbstverständlich halten, die wir nur verwenden, C ++ - Programme.
Stroustrup selbst kommentiert, dass C ++ Semantik viel sauberer ist als seine Syntax: "In C ++ gibt es eine viel kleinere und sauberere Sprache, die sich darum kämpft, herauszukommen."[99]
Andere Beschwerden können einen Mangel an beinhalten Betrachtung oder Müllsammlung, lange Zusammenstellungszeiten, wahrgenommen Feature Creep,[100] und ausführliche Fehlermeldungen, insbesondere aus der Vorlagen -Metaprogrammierung.[101]
Siehe auch
- Vergleich der Programmiersprachen
- Liste der C ++ - Compiler
- Umriss von C ++
- Kategorie: C ++ Bibliotheken
Fußnoten
- ^ Dieser Code wird direkt von der Errata -Seite von Bjarne Strousstrup (S. 633) kopiert. Er adressiert die Verwendung von
'\n'
stattstd :: endl
. Siehe auch Kann ich "void main ()" schreiben? für eine Erklärung des ImplizitenRückkehr 0;
in demhauptsächlich
Funktion. Diese implizite Rendite ist nicht Erhältlich in anderen Funktionen.
Verweise
- ^ a b c d e f Stroustrup, Bjarne (1996). "Eine Geschichte von C ++: 1979-1991". Geschichte der Programmiersprachen --- ii. ACM. S. 699–769. doi:10.1145/234286.1057836.
- ^ Stroustrup, Bjarne (16. Dezember 2021). "C ++ 20: Greifen Sie nach den Zielen von C ++ - Bjarne Stroustrup - CPPCON 2021". CPPCON.
- ^ Naugler, David (Mai 2007). "C# 2.0 für C ++ und Java -Programmierer: Conference Workshop". Journal of Computing Sciences in Colleges. 22 (5).
Obwohl C# stark von Java beeinflusst wurde, wurde es auch stark von C ++ beeinflusst und wird am besten als Nachkomme von C ++ und Java angesehen.
- ^ "Chapel Spec (Anerkennung)" (PDF). Cray Inc. 1. Oktober 2015. Archiviert (PDF) Aus dem Original am 24. Juni 2018. Abgerufen 14. Januar 2016.
- ^ "Rich Hickey Q & A von Michael Fogus". Archiviert von das Original am 11. Januar 2017. Abgerufen 11. Januar 2017.
- ^ Harry. H. Chaudhary (28. Juli 2014). "Das Java -Programming Interview :: 2000+ Java Interview Que/Ans". Archiviert vom Original am 27. Mai 2021. Abgerufen 29. Mai 2016.
- ^ Roger Poon (1. Mai 2017). "Skalierung JS ++: Abstraktion, Leistung und Lesbarkeit". Archiviert vom Original am 11. Mai 2020. Abgerufen 21. April 2020.
- ^ "FAQ -NIM -Programmiersprache". Archiviert Aus dem Original am 11. Juli 2017. Abgerufen 21. April 2020.
- ^ "9. Klassen - Python 3.6.4 Dokumentation". docs.python.org. Archiviert Aus dem Original am 23. Oktober 2012. Abgerufen 9. Januar 2018.
- ^ Stroustrup, Bjarne (1997). "1". Die C ++ - Programmiersprache (Dritter Aufl.). ISBN 0-201-88954-4. OCLC 59193992.
- ^ a b c Stroustrup, B. (6. Mai 2014). "Vortrag: Die Essenz von C ++. University of Edinburgh". Youtube. Archiviert Aus dem Original am 28. April 2015. Abgerufen 12. Juni 2015.
- ^ Stroustrup, Bjarne (17. Februar 2014). "C ++ Anwendungen". strousstrup.com. Archiviert vom Original am 4. April 2021. Abgerufen 5. Mai 2014.
- ^ a b "ISO/IEC 14882: 2020". Internationale Standardisierungsorganisation. Archiviert vom Original am 16. Dezember 2020. Abgerufen 16. Dezember 2020.
- ^ "Bjarne Strousstrups Homepage". www.strustrup.com. Archiviert vom Original am 14. Mai 2019. Abgerufen 15. Mai 2013.
- ^ "C ++ ist Zeitplan" (PDF). Archiviert (PDF) vom Original am 10. August 2020. Abgerufen 9. August 2020.
- ^ "C ++; wo es geht". Archiviert Aus dem Original am 3. Dezember 2018. Abgerufen 3. Dezember 2018.
- ^ a b Stroustrup, Bjarne (7. März 2010). "Bjarne Strousstrups FAQ: Wann wurde C ++ erfunden?". strousstrup.com. Archiviert Aus dem Original am 6. Februar 2016. Abgerufen 16. September 2010.
- ^ a b Stroustrup, Bjarne. "Entwicklung einer Sprache in und für die reale Welt: C ++ 1991-2006" (PDF). Archiviert (PDF) Aus dem Original am 20. November 2007. Abgerufen 14. August 2013.
- ^ a b c Stroustrup, Bjarne. "Eine Geschichte von C ++: 1979– 1991" (PDF). Archiviert (PDF) Aus dem Original am 2. Februar 2019. Abgerufen 18. Juli 2013.
- ^ Stroustrup, Bjarne. "Die C ++ - Programmiersprache" (First Ed.). Archiviert Aus dem Original am 9. August 2012. Abgerufen 16. September 2010.
- ^ Stroustrup, Bjarne. "Die C ++ - Programmiersprache" (Zweite Ausgabe). Archiviert Aus dem Original am 9. August 2012. Abgerufen 16. September 2010.
- ^ Sutter, Herb (30. Juni 2016). "Trip Report: Sommer ISO C ++ Standards Meeting (Oulu)". Herbutter.com. Archiviert von das Original am 8. Oktober 2016.
Der nächste Standard nach C ++ 17 ist C ++ 20
- ^ Dusíková, Hana (6. November 2019). "N4817: 2020 Prag Meeting Einladung und Informationen" (PDF). Archiviert (PDF) vom Original am 29. Dezember 2019. Abgerufen 13. Februar 2020.
- ^ "Aktueller Status". isocpp.org. Archiviert vom Original am 8. September 2020. Abgerufen 7. September 2020.
- ^ "C ++ 20 zugelassen - Herb Sutter". isocpp.org. Archiviert Aus dem Original am 11. September 2020. Abgerufen 8. September 2020.
- ^ "Informatik -Pionier Bjarne Stroustrup, um den Charles Stark Draper -Preis 2018 für Ingenieurwesen zu erhalten" (Pressemitteilung). Nationale Akademie des Ingenieurwesens. 3. Januar 2018. archiviert von das Original am 3. Januar 2018. Abgerufen 14. Dezember 2021.
- ^ Tiobe (Januar 2022). "Tiobe Index für Januar 2021". Tiobe.com. Tiobe Company. Archiviert vom Original am 25. Februar 2018. Abgerufen 2. Februar 2022.
- ^ "Bjarne Strousstrups FAQ - Woher kam der Name" C ++ "von?". Archiviert Aus dem Original am 6. Februar 2016. Abgerufen 16. Januar 2008.
- ^ "C für C ++ - Programmierer". Nordöstliche Universität. Archiviert von das Original am 17. November 2010. Abgerufen 7. September 2015.
- ^ "Geschichte von C ++". en.cppreference.com. Archiviert vom Original am 2. Februar 2022. Abgerufen 16. März 2022.
- ^ "ISO/IEC 14882: 1998". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2017. Abgerufen 23. November 2018.
- ^ "ISO/IEC 14882: 2003". Internationale Standardisierungsorganisation. Archiviert vom Original am 13. August 2021. Abgerufen 23. November 2018.
- ^ a b "ISO/IEC 14882: 2011". Internationale Standardisierungsorganisation. Archiviert vom Original am 27. Mai 2016. Abgerufen 23. November 2018.
- ^ "ISO/IEC 14882: 2014". Internationale Standardisierungsorganisation. Archiviert vom Original am 29. April 2016. Abgerufen 23. November 2018.
- ^ "ISO/IEC 14882: 2017". Internationale Standardisierungsorganisation. Archiviert vom Original am 29. Januar 2013. Abgerufen 2. Dezember 2017.
- ^ "Wir haben einen internationalen Standard: C ++ 0x ist einstimmig zugelassen". Sutters Mühle. 12. August 2011. Archiviert Aus dem Original am 28. Juni 2018. Abgerufen 23. November 2018.
- ^ "Die Zukunft von C ++". Archiviert Aus dem Original am 23. Oktober 2018. Abgerufen 23. November 2018 - über Channel9.msdn.com.
- ^ "Wir haben C ++ 14!: Standard C ++". isocpp.org. Archiviert Aus dem Original am 19. August 2014. Abgerufen 19. August 2014.
- ^ Sutter, Herb (15. Juli 2017). "Trip Report: Sommer ISO C ++ Standards Meeting (Toronto)". Archiviert Aus dem Original am 6. August 2017. Abgerufen 4. August 2017.
- ^ "ISO/IEC TR 18015: 2006". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TR 19768: 2007". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 4. März 2016. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TR 29124: 2010". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 12. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TR 24733: 2011". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 18822: 2015". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19570: 2015". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19841: 2015". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19568: 2015". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19217: 2015". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19571: 2016". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19568: 2017". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 21425: 2017". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 22277: 2017". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19216: 2018". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 21544: 2018". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 19570: 2018". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Januar 2019. Abgerufen 15. Februar 2019.
- ^ "ISO/IEC TS 23619: 2021". Internationale Standardisierungsorganisation. Archiviert Aus dem Original am 15. Dezember 2018. Abgerufen 11. Oktober 2021.
- ^ Sehen Sie eine Liste bei "Experimentelle C ++ - Funktionen". cppreference.com. Archiviert von das Original am 23. November 2018. Abgerufen 15. Februar 2019.
- ^ B. Stroustrup (interviewt von Sergio de Simone) (30. April 2015). "Stroustrup: Gedanken zu C ++ 17 - Ein Interview". Archiviert Aus dem Original am 8. Juli 2015. Abgerufen 8. Juli 2015.
- ^ Stroustrup, Bjarne (2000). Die C ++ - Programmiersprache (Special Ed.). Addison-Wesley. p. 46. ISBN 0-201-70073-5.
- ^ Stroustrup, Bjarne. "Öffnen Sie Probleme für die C ++ - Programmiersprache (3. Auflage)". Archiviert Aus dem Original am 5. Mai 2014. Abgerufen 5. Mai 2014.
- ^ ISO/IEC. Programmiersprachen - C ++ 11 Entwurf (N3797) Archiviert 2. Oktober 2018 bei der Wayback -Maschine §3.7 Speicherdauer [Basic.stc]
- ^ ISO/IEC. Programmiersprachen - C ++ 11 Entwurf (N3797) Archiviert 2. Oktober 2018 bei der Wayback -Maschine §3.7.1 Statische Speicherdauer [Basic.stc.static]
- ^ ISO/IEC. Programmiersprachen - C ++ 11 Entwurf (N3797) Archiviert 2. Oktober 2018 bei der Wayback -Maschine §3.7.2 Threadspeicherdauer [Basic.stc.Thread]
- ^ ISO/IEC. Programmiersprachen - C ++ 11 Entwurf (N3797) Archiviert 2. Oktober 2018 bei der Wayback -Maschine §3.7.3 Automatische Speicherdauer [Basic.stc.auto]
- ^ ISO/IEC. Programmiersprachen - C ++ 11 Entwurf (N3797) Archiviert 2. Oktober 2018 bei der Wayback -Maschine §3.7.4 Dynamische Speicherdauer [Basic.stc.dynamic]
- ^ "C ++ Kernrichtlinien". isocpp.github.io. Archiviert vom Original am 8. Februar 2020. Abgerufen 9. Februar 2020.
- ^ a b "Niemand versteht C ++: Teil 5: Vorlagencode aufblähen". Artikel.Emptycrate.com/: Leerecrate Software. Reisen. Sachen. 6. Mai 2008. Archiviert vom Original am 25. April 2016. Abgerufen 8. März 2010.
Gelegentlich lesen oder hören Sie jemanden, der über C ++ - Vorlagen spricht, die Code aufblähen. Ich habe neulich darüber nachgedacht und mir gedacht: "Selbst, wenn der Code genau dasselbe tut, kann der kompilierte Code nicht wirklich größer sein, oder?" [...] Und was ist mit kompilierter Codegröße? Jedes wurden mit dem Befehl G ++ <Dateiname> .cpp -o3 kompiliert. Nicht-Template-Version: 8140 Bytes, Vorlagenversion: 8028 Bytes!
- ^ Sutter, Kraut; Alexandrescu, Andrei (2004). C ++ Codierungsstandards: 101 Regeln, Richtlinien und Best Practices. Addison-Wesley.
- ^ Henricson, Matten; Nyquist, Erik (1997). Industriestärke C ++. Prentice Hall. ISBN 0-13-120965-5.
- ^ Stroustrup, Bjarne (2000). Die C ++ - Programmiersprache (Special Ed.). Addison-Wesley. p. 310. ISBN 0-201-70073-5.
Eine virtuelle Mitgliedsfunktion wird manchmal als a genannt Methode.
- ^ Mycroft, Alan (2013). "C und C ++ Ausnahmen | Vorlagen" (PDF). Cambridge Computer Laboratory - Kursmaterialien 2013-14. Archiviert (PDF) vom Original am 13. Mai 2016. Abgerufen 30. August 2016.
- ^ Stroustrup, Bjarne (2013). Die C ++ - Programmiersprache. Addison Wesley. p. 345. ISBN 9780321563842.
- ^ Stroustrup, Bjarne (2013). Die C ++ - Programmiersprache. Addison Wesley. S. 363–365. ISBN 9780321563842.
- ^ Stroustrup, Bjarne (2013). Die C ++ - Programmiersprache. Addison Wesley. S. 345, 363. ISBN 9780321563842.
- ^ "Google C ++ Style Guide". Archiviert Aus dem Original am 16. März 2019. Abgerufen 25. Juni 2019.
- ^ "LLVM -Codierungsstandards". LLVM 9 Dokumentation. Archiviert Aus dem Original am 27. Juni 2019. Abgerufen 25. Juni 2019.
- ^ "Konventionen codieren". Qt Wiki. Archiviert Aus dem Original am 26. Juni 2019. Abgerufen 26. Juni 2019.
- ^ Stroustrup, Bjarne (2013). Die C ++ - Programmiersprache. Addison Wesley. S. 344, 370. ISBN 9780321563842.
- ^ Stroustrup, Bjarne (2013). Die C ++ - Programmiersprache. Addison Wesley. p. 349. ISBN 9780321563842.
- ^ Graziano Lo Russo (2008). "Ein Interview mit A. Stepanov". stlport.org. Archiviert Aus dem Original am 4. März 2009. Abgerufen 8. Oktober 2015.
- ^ "C ++ Kernrichtlinien". isocpp.github.io. Archiviert vom Original am 16. Februar 2020. Abgerufen 9. Februar 2020.
- ^ "Bjarne Strousstrup kündigt C ++ - Kernrichtlinien an: Standard C ++". isocpp.org. Archiviert vom Original am 11. Mai 2020. Abgerufen 31. März 2020.
- ^ "Microsoft/GSL". 18. Juli 2021. Archiviert Aus dem Original am 18. Juli 2021. Abgerufen 18. Juli 2021 - über Github.
- ^ "Verwenden der C ++ - Kernrichtlinienprüfers". docs.microsoft.com. Archiviert vom Original am 13. August 2021. Abgerufen 31. März 2020.
- ^ "C ++ ABI Zusammenfassung". 20. März 2001. Archiviert Aus dem Original am 10. Juli 2018. Abgerufen 30. Mai 2006.
- ^ "Bjarne Strousstrups FAQ - Ist C eine Untergruppe von C ++?". Archiviert Aus dem Original am 6. Februar 2016. Abgerufen 5. Mai 2014.
- ^ "C9X - der neue C -Standard". Archiviert Aus dem Original am 21. Juni 2018. Abgerufen 27. Dezember 2008.
- ^ "C ++ 0x Unterstützung in GCC". Archiviert Aus dem Original am 21. Juli 2010. Abgerufen 12. Oktober 2010.
- ^ "C ++ 0x Kernsprachenfunktionen in VC10: Die Tabelle". Archiviert Aus dem Original am 21. August 2010. Abgerufen 12. Oktober 2010.
- ^ "Clang - C ++ 98, C ++ 11 und C ++ 14 Status". Clang.llvm.org. 12. Mai 2013. Archiviert Aus dem Original am 4. Juli 2013. Abgerufen 10. Juni 2013.
- ^ "Re: [RFC] Konvertieren Sie Builin-mailinfo.c, um die bessere String-Bibliothek zu verwenden." (Mailingliste). 6. September 2007. Archiviert vom Original am 8. März 2021. Abgerufen 31. März 2015.
- ^ "Re: Bemühungen, mehr Benutzer anzulocken?" (Mailingliste). 12. Juli 2010. Archiviert Aus dem Original am 21. März 2015. Abgerufen 31. März 2015.
- ^ Andrew Binstock (18. Mai 2011). "Dr. Dobbs: Interview mit Ken Thompson". Archiviert vom Original am 13. März 2014. Abgerufen 7. Februar 2014.
- ^ a b Peter Seibel (16. September 2009). Codierer bei der Arbeit: Überlegungen zum Programm der Programmierung. Apress. S. 475–476. ISBN 978-1-4302-1948-4. Archiviert Aus dem Original am 1. Dezember 2019. Abgerufen 9. November 2017.
- ^ a b "C ++ in Codierern bei der Arbeit". 16. Oktober 2009. Archiviert Aus dem Original am 10. November 2017. Abgerufen 9. November 2017.
- ^ a b "Ein Interview mit Donald Knuth". Dr. Dobbs. Archiviert vom Original am 8. März 2021. Abgerufen 18. Juli 2021.
- ^ a b "(La) Tex Navigator". Archiviert Aus dem Original am 20. November 2017. Abgerufen 10. November 2017.
- ^ Brian Kernighan (18. Juli 2018). Brian Kernighan Q & A - Computerphile. Archiviert von das Original am 25. September 2021.
- ^ "Stroustrup: FAQ". www.strustrup.com. Archiviert Aus dem Original am 6. Februar 2016. Abgerufen 7. Juni 2013.
- ^ Pike, Rob (2012). "Weniger ist exponentiell mehr". Archiviert Aus dem Original am 7. Juli 2017. Abgerufen 23. November 2018.
- ^ Kreinin, Yossi (13. Oktober 2009). "Defekt C ++". Archiviert Aus dem Original am 5. Februar 2016. Abgerufen 3. Februar 2016.
Weitere Lektüre
- Abrahams, David; Gurtovoy, Aleksey (2005). C ++ Template Metaprogrammierung: Konzepte, Werkzeuge und Techniken von Boost und darüber hinaus. Addison-Wesley. ISBN 0-321-22725-5.
- Alexandrescu, Andrei (2001). Modernes C ++ - Design: Generische Programmier- und Entwurfsmuster angewendet. Addison-Wesley. ISBN 0-201-70431-5.
- Alexandrescu, Andrei; Sutter, Kraut (2004). C ++ Design- und Codierungsstandards: Regeln und Richtlinien für das Schreiben von Programmen. Addison-Wesley. ISBN 0-321-11358-6.
- Becker, Pete (2006). Die C ++ - Standard -Bibliothekserweiterungen: ein Tutorial und eine Referenz. Addison-Wesley. ISBN 0-321-41299-0.
- Brokken, Frank (2010). C ++ Anmerkungen. Universität von Groningen. ISBN 978-90-367-0470-0. Archiviert Aus dem Original am 28. April 2010. Abgerufen 28. April 2010.
- Coplien, James O. (1994) [Nachdruck mit Korrekturen, Originaljahr der Veröffentlichung 1992]. Erweitertes C ++: Programmierstile und Redewendungen. ISBN 0-201-54855-0.
- DeWhurst, Stephen C. (2005). C ++ allgemein bekanntes Wissen: Wesentliche Zwischenprogrammierung. Addison-Wesley. ISBN 0-321-32192-8.
- Branchenrat für Informationstechnologie (15. Oktober 2003). Programmiersprachen - C ++ (Zweite Ausgabe). Genf: ISO/IEC. 14882: 2003 (e).
- Josuttis, Nicolai M. (2012). Die C ++ - Standardbibliothek, ein Tutorial und eine Referenz (Zweite Ausgabe). Addison-Wesley. ISBN 978-0-321-62321-8.
- Koenig, Andrew; Moo, Barbara E. (2000). Beschleunigter C ++ - Praktisches Programmieren mit gutem Beispielsweise. Addison-Wesley. ISBN 0-201-70353-x.
- Lippman, Stanley B.;Lajoie, Josée;Moo, Barbara E. (2011). C ++ - Primer (Fünfter Aufl.).Addison-Wesley. ISBN 978-0-321-71411-4.
- Lippman, Stanley B. (1996). Innerhalb des C ++ - Objektmodells. Addison-Wesley. ISBN 0-201-83454-5.
- Meyers, Scott (2005). Effektives C ++ (Dritter Aufl.).Addison-Wesley. ISBN 0-321-33487-6.
- Stroustrup, Bjarne (2013). Die C ++ - Programmiersprache (Viertes Ausgabe).Addison-Wesley. ISBN 978-0-321-56384-2.
- Stroustrup, Bjarne (1994). Das Design und die Entwicklung von C ++. Addison-Wesley. ISBN 0-201-54330-3.
- Stroustrup, Bjarne (2014). Programmierung: Prinzipien und Praxis mit C ++ (Zweite Ausgabe). Addison-Wesley. ISBN 978-0-321-99278-9.
- Sutter, Kraut (2001). Weitere außergewöhnliche C ++: 40 neue technische Rätsel, Programmierprobleme und Lösungen. Addison-Wesley. ISBN 0-201-70434-x.
- Sutter, Kraut (2004). Außergewöhnlicher C ++ - Stil. Addison-Wesley. ISBN 0-201-76042-8.
- Vandevoorde, David;Josuttis, Nicolai M. (2003). C ++ - Vorlagen: Die vollständige Anleitung. Addison-Wesley. ISBN 0-201-73484-2.
Externe Links
- JTC1/SC22/WG21 - Die ISO/IEC C ++ Standardarbeitsgruppe
- Standard C ++ Fundament -Eine gemeinnützige Organisation, die die Verwendung und das Verständnis von Standard C ++ fördert. Bjarne Stroustrup ist ein Direktor der Organisation.