C ++

C ++ (ausgesprochen "cee plus plus") ist statisch getippt, freie Form, Mehrparadigma, kompilierte Mehrzweckprogrammiersprache. Es wird als eine Zwischenniveau-Sprache betrachtet, weil es eine Kombination sowohl von auf niedriger Stufe Spracheigenschaften auf höchster Ebene umfasst. Es wurde von Bjarne Stroustrup entwickelt, der 1979 an Glockenlaboratorien als eine Erhöhung in die c Sprache anfängt. Ursprünglich genannter C mit Klassen, die Sprache wurde C ++ 1983 als ein Wortspiel umbenannt, das den Zunahme-Maschinenbediener einbezieht.

C ++ ist eine der populärsten Programmiersprachen mit Anwendungsgebieten einschließlich der Systemsoftware, Anwendungssoftware, Gerät-Fahrer, hat Software, Hochleistungsserver und Client-Anwendungen und Unterhaltungssoftware wie Videospiele eingebettet. Mehrere Gruppen stellen sowohl freien als auch EigentumsC ++ Bearbeiter-Software, einschließlich des GNU-Projektes, Microsofts, Intel und Embarcadero Technologies zur Verfügung. C ++ hat viele andere populäre Programmiersprachen, am meisten namentlich C# und Java außerordentlich beeinflusst.

C ++ wird auch für das Hardware-Design verwendet, wo das Design in C ++ am Anfang beschrieben, dann analysiert, architektonisch beschränkt und vorgesehen wird, um eine Niveau-Hardware-Beschreibungssprache der Register-Übertragung über die Synthese auf höchster Ebene zu schaffen.

Die Sprache hat als Erhöhungen zu C begonnen, zuerst Klassen, dann virtuelle Funktionen, Maschinenbediener hinzufügend, der, Mehrfachvererbung, Schablonen und Ausnahme überlädt, die unter anderen Eigenschaften behandelt. Nach Jahren der Entwicklung der C ++ wurde Programmiersprache-Standard 1998 als ISO/IEC 14882:1998 bestätigt. Der Standard wurde vor 2003 technische Berichtigung, ISO/IEC 14882:2003 amendiert. Der aktuelle Standard, der sich C ++ mit neuen Eigenschaften ausstreckt, wurde bestätigt und durch ISO im September 2011 als ISO/IEC 14882:2011 (informell bekannt als C ++ 11) veröffentlicht.

Geschichte

Bjarne Stroustrup hat Arbeit an "C mit Klassen" 1979 begonnen. Die Idee, eine neue Sprache zu schaffen, ist aus der Erfahrung von Stroustrup in der Programmierung für seine Doktorarbeit entstanden. Stroustrup hat gefunden, dass Simula Eigenschaften hatte, die für die große Softwareentwicklung sehr nützlich waren, aber die Sprache war für den praktischen Gebrauch zu langsam, während BCPL schnell, aber zu auf niedriger Stufe war, um für die große Softwareentwicklung passend zu sein. Als Stroustrup angefangen hat, in AT&T Glockenlaboratorien zu arbeiten, hatte er das Problem, den UNIX Kern in Bezug auf die verteilte Computerwissenschaft zu analysieren. Sich an seine Doktorerfahrung erinnernd, hat Stroustrup begonnen, die c Sprache mit Simula ähnlichen Eigenschaften zu erhöhen. C wurde gewählt, weil es Mehrzweck-, schnell, tragbar und weit verwendet war. Außer C und Simula waren einige andere Sprachen, die ihn begeistert haben, Algol 68, Ada, CLU und ML. Zuerst, die Klasse, hat Klasse, starke Datentypprüfung, inlining abgeleitet, und Verzug-Argument-Eigenschaften wurden zu C über den C von Stroustrup ++ zum C Bearbeiter, Cfront hinzugefügt. Die erste kommerzielle Durchführung von C ++ wurde am 14. Oktober 1985 veröffentlicht.

1983 wurde der Name der Sprache von C mit Klassen zu C ++ (++ geändert der Zunahme-Maschinenbediener in C zu sein). Neue Eigenschaften wurden einschließlich virtueller Funktionen, Funktionsnamens und Maschinenbedieners hinzugefügt, der, Verweisungen überlädt, Konstanten, benutzerkontrollierte Speicherkontrolle des freien Ladens, haben Datentypprüfung und BCPL Stil einzeilige Anmerkungen mit zwei Vorwärtshieben verbessert. 1985 die Erstausgabe Des C ++ wurde Programmiersprache veröffentlicht, eine wichtige Verweisung auf die Sprache zur Verfügung stellend, seitdem es noch nicht einen offiziellen Standard gab. Die Ausgabe 2.0 von C ++ ist 1989 und die aktualisierte zweite Ausgabe Des C ++ gekommen Programmiersprache wurde 1991 veröffentlicht. Neue Eigenschaften haben Mehrfachvererbung, abstrakte Klassen, statische Mitglied-Funktionen, const Mitglied-Funktionen eingeschlossen, und haben Mitglieder geschützt. 1990 wurde Der Kommentierte C ++ Bedienungshandbuch veröffentlicht. Diese Arbeit ist die Basis für den zukünftigen Standard geworden. Die späte Hinzufügung von Eigenschaften hat Schablonen, Ausnahmen, namespaces, neue Würfe und einen Typ Boolean eingeschlossen.

Als der C ++ hat sich Sprache, die damit entwickelte Standardbibliothek entwickelt. Die erste Hinzufügung zum C ++ war Standardbibliothek die Strom-Eingabe/Ausgabe-Bibliothek, die Möglichkeiten zur Verfügung gestellt hat, die traditionellen C-Funktionen wie printf und scanf zu ersetzen. Später, unter den bedeutendsten Hinzufügungen zur Standardbibliothek, war große Beträge der Standardschablone-Bibliothek.

C ++ wird manchmal eine hybride Sprache genannt.

Es ist möglich, Gegenstand orientierten oder verfahrensrechtlichen Code in demselben Programm in C ++ zu schreiben. Das hat eine Sorge verursacht, dass ein C ++ Programmierer noch Verfahrenscode schreiben, aber unter dem Eindruck sind, dass es Gegenstand orientiert einfach ist, weil sie C ++ verwenden. Häufig ist es eine Fusion der zwei. Das verursacht gewöhnlich die meisten Probleme, wenn der Code wieder besucht wird oder die Aufgabe durch einen anderen Codierer übernommen wird.

C ++ setzt fort, verwendet zu werden, und ist eine der bevorzugten Programmiersprachen, um Berufsanwendungen zu entwickeln.

Etymologie

Gemäß Stroustrup: "Der Name bedeutet die Entwicklungsnatur der Änderungen von C". Während C ++ 's Entwicklungsperiode war die Sprache "neuen C", dann "C mit Klassen" genannt geworden. Der Endname wird Rick Mascitti (Mitte 1983) kreditiert und wurde zuerst im Dezember 1983 verwendet. Als Mascitti informell 1992 über das Namengeben befragt wurde, hat er angezeigt, dass es in einem ironischen Geist gegeben wurde. Es stammt von C "++" Maschinenbediener (der den Wert einer Variable erhöht), und eine allgemeine Namengeben-Tagung, "+" zu verwenden, um ein erhöhtes Computerprogramm anzuzeigen. Es gibt keine Sprache genannt "C plus". ABCL/c + war der Name einer früheren, Programmiersprache ohne Beziehung.

Standardisierung

1998 der C ++ hat Standardkomitee (der ISO/IEC JTC1/SC22/WG21 Arbeitsgruppe) C ++ standardisiert und hat den internationalen normalen ISO/IEC 14882:1998 (informell bekannt als C ++ 98) veröffentlicht. Seit einigen Jahren nach der offiziellen Ausgabe des Standards hat das Komitee Defekt-Berichte bearbeitet, und hat eine korrigierte Version des C ++ Standard, ISO/IEC 14882:2003 2003 veröffentlicht. 2005 wurde ein technischer Bericht, genannt die "Bibliothek Technischer Bericht 1" (häufig bekannt als TR1 für den kurzen), veröffentlicht. Während nicht ein offizieller Teil des Standards, es mehrere Erweiterungen auf die Standardbibliothek angegeben hat, die, wie man erwartete, in die folgende Version von C ++ eingeschlossen wurden. Die Unterstützung für TR1 wächst darin fast allen haben zurzeit C ++ Bearbeiter aufrechterhalten.

Die letzte Hauptrevision des C ++ Standard, C ++ 11, (früher bekannt als C ++ 0x) wurde durch ISO/IEC am 12. August 2011 genehmigt. Es ist als 14882:2011 veröffentlicht worden.

Philosophie

Im Design und der Evolution von C ++ (1994) beschreibt Bjarne Stroustrup einige Regeln, dass er für das Design von C ++ verwendet hat:

  • C ++ wird entworfen, um eine statisch getippte, Allzwecksprache zu sein, die so effizient und tragbar ist wie C
  • C ++ wird zu direkt entworfen, und unterstützen Sie umfassend vielfache Programmierstile (Verfahrensprogrammierung, Datenabstraktion, objektorientierte Programmierung und allgemeine Programmierung)
  • C ++ wird entworfen, um die Programmierer-Wahl zu geben, selbst wenn das es möglich für den Programmierer macht, falsch zu wählen
  • C ++ wird entworfen, um so mit C vereinbar zu sein wie möglich, deshalb einen glatten Übergang von C zur Verfügung stellend
  • C ++ vermeidet Eigenschaften, die Plattform spezifisch oder nicht allgemeiner Zweck sind
  • C ++ übernimmt oben für Eigenschaften nicht, die (der "Nullobergrundsatz") nicht verwendet werden
  • C ++ wird entworfen, um ohne eine hoch entwickelte Programmierumgebung zu fungieren

Innerhalb des C ++ beschreibt Gegenstand-Modell (Lippman, 1996), wie Bearbeiter Bekehrter C ++ Programm-Behauptungen in ein Lay-Out im Gedächtnis können. Bearbeiter-Autoren sind jedoch, frei, den Standard auf ihre eigene Weise durchzuführen.

Standardbibliothek

1998 ANSI/ISO C ++ Standard besteht aus zwei Teilen: die Kernsprache und der C ++ Standardbibliothek; der Letztere schließt den grössten Teil von Standard Template Library (STL) und eine ein bisschen modifizierte Version der C Standardbibliothek ein. Viele C ++ bestehen Bibliotheken, die nicht ein Teil des Standards, und mit der Verbindungsspezifizierung sind, können Bibliotheken sogar auf Sprachen solcher als GRUNDLEGEND, C, Fortran oder Pascal geschrieben werden. Welcher von diesen unterstützt wird, ist von dem Bearbeiter abhängig.

Der C ++ vereinigt Standardbibliothek die C Standardbibliothek mit einigen kleinen Modifizierungen, um zu machen, es hat mit dem C ++ Sprache optimiert. Ein anderer großer Teil des C ++ Bibliothek basiert auf dem STL. Das stellt solche nützlichen Werkzeuge als Behälter (zum Beispiel Vektoren und Listen), iterators zur Verfügung, um diese Behälter mit dem einer Reihe ähnlichen Zugang und den Algorithmen zu versorgen, um Operationen wie Suche und das Sortieren durchzuführen. Außerdem werden (viel)-Karten (assoziative Reihe) und (viel)-Sätze zur Verfügung gestellt, von denen alle vereinbare Schnittstellen exportieren. Deshalb ist es mit Schablonen möglich, um allgemeine Algorithmen zu schreiben, die mit jedem Behälter oder auf jeder durch iterators definierten Folge arbeiten. Als in C wird auf die Eigenschaften der Bibliothek durch das Verwenden der Direktive zugegriffen, um einen Standardkopfball einzuschließen. C ++ stellt 72 Standardkopfbälle zur Verfügung, von denen 17 missbilligt werden.

Der STL war ursprünglich eine Drittbibliothek vom HP und später SGI, vor seiner Integration in den C ++ Standard. Der Standard bezieht sich darauf als "STL" nicht, weil es bloß ein Teil der Standardbibliothek ist, aber viele Menschen gebrauchen noch diesen Begriff, um es vom Rest der Bibliothek (Ströme des Eingangs/Produktion, Internationalisierung, Diagnostik, die C Bibliotheksteilmenge, usw.) zu unterscheiden.

Die meisten C ++ Bearbeiter stellen eine Durchführung des C ++ Standardbibliothek einschließlich des STL zur Verfügung. Mit dem Bearbeiter unabhängige Durchführungen des STL, wie STLPort, bestehen auch. Andere Projekte erzeugen auch verschiedene kundenspezifische Durchführungen des C ++ Standardbibliothek und der STL mit verschiedenen Designabsichten.

Spracheigenschaften

C ++ erbt den grössten Teil der Syntax von C. Der folgende ist die Version von Bjarne Stroustrup des Hallo Weltprogramms, das den C ++ Standardbibliotheksstrom-Möglichkeit verwendet, eine Nachricht an die Standardproduktion zu schreiben:

  1. einschließen

int Hauptsache

{\

std:: cout

Innerhalb von Funktionen, die einen nichtleeren Rücktyp, Misserfolg definieren, einen Wert zurückzugeben, bevor reicht Kontrolle das Ende der Funktion läuft auf unbestimmtes Verhalten hinaus (Bearbeiter stellen normalerweise die Mittel zur Verfügung, einen diagnostischen in solch einem Fall auszugeben). Die alleinige Ausnahme zu dieser Regel ist die Funktion, die implizit einen Wert der Null zurückgibt.

Maschinenbediener und Maschinenbediener, der überlädt

C ++ stellt mehr als 35 Maschinenbedienern zur Verfügung, grundlegende Arithmetik, Bit-Manipulation, Umweg, Vergleiche, logische Operationen und andere bedeckend. Fast alle Maschinenbediener können für benutzerbestimmte Typen, mit einigen bemerkenswerten Ausnahmen wie Mitglied-Zugang (und) sowie der bedingte Maschinenbediener überladen werden. Der reiche Satz von overloadable Maschinenbedienern ist zum Verwenden C ++ als eine bereichsspezifische Sprache zentral. Die overloadable Maschinenbediener sind auch ein wesentlicher Teil von vielen hat C ++ Programmierung von Techniken wie kluge Zeigestöcke vorgebracht. Überbelastung eines Maschinenbedieners ändert die Priorität von Berechnungen nicht, die mit dem Maschinenbediener verbunden sind, noch es ändert die Zahl von operands, den der Maschinenbediener verwendet (jeder operand kann jedoch vom Maschinenbediener ignoriert werden, obwohl es vor der Ausführung bewertet wird). Überladene "" und "" Maschinenbediener verlieren ihren, Einschätzungseigentum gekurzschlossen.

Schablonen

C ++ ermöglichen Schablonen allgemeine Programmierung. C ++ unterstützt sowohl Funktion als auch Klassenschablonen. Schablonen können durch Typen, Übersetzungszeit-Konstanten und andere Schablonen parametrisiert werden. C ++ werden Schablonen durch instantiation während der Übersetzung durchgeführt. Um eine Schablone zu realisieren, wechseln Bearbeiter gegen spezifische Argumente für Rahmen einer Schablone aus, um eine konkrete Funktion oder Klassenbeispiel zu erzeugen. Einige Ersetzungen sind nicht möglich; diese werden durch eine Überlastungsentschlossenheitspolitik beseitigt, die durch den Ausdruck "Ersatz-Misserfolg beschrieben ist, ist nicht ein Fehler" (SFINAE). Schablonen sind ein starkes Werkzeug, das für die allgemeine Programmierung, Schablone metaprogramming und Codeoptimierung verwendet werden kann, aber diese Macht bezieht Kosten ein. Schablone-Gebrauch kann Codegröße vergrößern, da jede Schablone instantiation eine Kopie des Schablone-Codes erzeugt: ein für jeden Satz von Schablone-Argumenten. Das ist im Gegensatz zur Durchlaufzeit generics gesehen auf anderen Sprachen (z.B. Java), wo während der Übersetzung der Typ gelöscht wird und ein einzelner Schablone-Körper, wird bewahrt.

Schablonen sind von Makros verschieden: Während beide dieser Übersetzungszeit-Spracheigenschaften bedingte Kompilation ermöglichen, werden Schablonen auf den lexikalischen Ersatz nicht eingeschränkt. Schablonen sind der Semantik und des Typ-Systems ihrer dazugehörigen Sprache, sowie aller Übersetzungszeit-Typ-Definitionen bewusst, und können Operationen auf höchster Ebene einschließlich der auf der Einschätzung von ausschließlich Typ-karierten Rahmen gestützten Programmatic-Fluss-Kontrolle durchführen. Makros sind zur bedingten Kontrolle über die Kompilation fähig, die auf vorher bestimmten Kriterien gestützt ist, aber können neue Typen nicht realisieren, wiederfluchen, oder Typ-Einschätzung durchführen und werden tatsächlich auf den Vorkompilationstextersatz und text-inclusion/exclusion beschränkt. Mit anderen Worten können Makros auf vorherbestimmten Symbolen gestützten Kompilationsfluss kontrollieren, aber kann nicht verschieden von Schablonen, unabhängig neue Symbole realisieren. Schablonen sind ein Werkzeug für statischen polymorphism (sieh unten) und allgemeine Programmierung.

Außerdem sind Schablonen ein Übersetzungszeit-Mechanismus in C ++, der Turing-abgeschlossen ist, bedeutend, dass jede Berechnung expressible durch ein Computerprogramm, in einer Form, durch eine Schablone metaprogram vor der Durchlaufzeit geschätzt werden kann.

In der Zusammenfassung ist eine Schablone parametrisierte Funktion einer Übersetzungszeit, oder ohne Kenntnisse der spezifischen Argumente geschriebene Klasse hat gepflegt, es zu realisieren. Danach instantiation ist der resultierende Code zum Code geschrieben spezifisch für die passierten Argumente gleichwertig. Auf diese Weise stellen Schablonen einen Weg zu decouple allgemeinen, weit gehend anwendbaren Aspekten von Funktionen und Klassen (verschlüsselt in Schablonen) von spezifischen Aspekten (verschlüsselt in Schablone-Rahmen) zur Verfügung, ohne Leistung wegen der Abstraktion zu opfern.

Gegenstände

C ++ führt Eigenschaften der objektorientierten Programmierung (OOP) in C ein. Es bietet Klassen an, die die vier Eigenschaften zur Verfügung stellen, allgemein präsentieren in OOP (und ein non-OOP) Sprachen: Abstraktion, encapsulation, Erbe und polymorphism. Gegenstände sind Beispiele von an der Durchlaufzeit geschaffenen Klassen. Ein Unterscheidungsmerkmal von C ++ sind Klassen im Vergleich zu Klassen auf anderen Programmiersprachen Unterstützung für deterministische destructors, die der Reihe nach Unterstützung für die Betriebsmittelzuweisung zur Verfügung stellen, ist Initialisierungskonzept.

Encapsulation

Encapsulation ist das Verbergen der Information, um sicherzustellen, dass Datenstrukturen und Maschinenbediener, wie beabsichtigt, verwendet werden und das Gebrauch-Modell offensichtlicher dem Entwickler zu machen. C ++ stellt die Fähigkeit zur Verfügung, Klassen und Funktionen als seine primären encapsulation Mechanismen zu definieren. Innerhalb einer Klasse können Mitglieder entweder als das Publikum, geschützt oder als privat erklärt werden, um encapsulation ausführlich geltend zu machen. 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 und zu Funktionen und Klassen ausführlich gewährte Zugriffserlaubnis durch die Klasse ("Freunde") sind. Ein geschütztes Mitglied ist für Mitglieder von Klassen zugänglich, die von der Klasse zusätzlich zur Klasse selbst und irgendwelchen Freunden erben.

Der OO Grundsatz ist, dass alle Funktionen (und nur die Funktionen), dass Zugang die innere Darstellung eines Typs innerhalb der Typ-Definition kurz zusammengefasst werden sollte. C ++ unterstützt das (über Mitglied-Funktionen und Freund Funktionen), aber macht es nicht geltend: Der Programmierer kann Teile oder die ganze Darstellung eines Typs erklären, öffentlich zu sein, und wird erlaubt, öffentliche Entitäten zu machen, die nicht ein Teil der Darstellung des Typs sind. Deshalb, C ++ unterstützt nicht nur OO Programmierung, aber andere schwächere Zergliederungsparadigmen wie Modulprogrammierung.

Es wird allgemein als gute Praxis betrachtet, um alle Daten privat oder geschützt zu machen, und nur jene Funktionen bekannt zu geben, die ein Teil einer minimalen Schnittstelle für Benutzer der Klasse sind. Das kann die Details der Datendurchführung verbergen, dem Entwerfer später im Wesentlichen Änderung die Durchführung erlaubend, ohne die Schnittstelle in jedem Fall zu ändern.

Erbe

Erbe erlaubt einem Datentyp, Eigenschaften anderer Datentypen zu erwerben. Das Erbe von einer Grundklasse kann als Publikum, geschützt oder privat erklärt werden. Dieser Zugang specifier bestimmt, ob abgeleitete Klassen ohne Beziehung auf die geerbten öffentlichen und geschützten Mitglieder der Grundklasse zugreifen können. Nur öffentliches Erbe entspricht, was gewöhnlich durch "das Erbe" gemeint wird. Die anderen zwei Formen werden viel weniger oft verwendet. Wenn der Zugang specifier weggelassen wird, erbt eine "Klasse" privat, während ein "struct" öffentlich erbt. Grundklassen können als virtuell erklärt werden; das wird virtuelles Erbe genannt. Virtuelles Erbe stellt sicher, dass nur ein Beispiel einer Grundklasse im Erbe-Graphen besteht, einige der Zweideutigkeitsprobleme der Mehrfachvererbung vermeidend.

Mehrfachvererbung ist ein C ++ auf den meisten anderen Sprachen nicht gefundene Eigenschaft, einer Klasse erlaubend, aus mehr als einer Grundklassen abgeleitet zu werden; das berücksichtigt mehr wohl durchdachte Erbe-Beziehungen. Zum Beispiel kann eine "Fliegende Katze" Klasse sowohl von "der Katze" als auch "vom Fliegenden Säugetier" erben. Einige andere Sprachen, solcher als C# oder Java, vollbringen etwas Ähnliches (obwohl mehr beschränkt) durch das Erlauben des Erbes von vielfachen Schnittstellen, während sie die Zahl von Grundklassen zu einer einschränken (Schnittstellen, verschieden von Klassen, nur Behauptungen von Mitglied-Funktionen, keiner Durchführung oder Mitglied-Daten zur Verfügung stellen). Eine Schnittstelle als in C# und Java kann in C ++ als eine Klasse definiert werden, die nur reine virtuelle Funktionen häufig enthält, die als eine abstrakte Grundklasse oder "Abc" bekannt sind. Die Mitglied-Funktionen solch einer abstrakten Grundklasse werden normalerweise in der abgeleiteten Klasse, nicht geerbt implizit ausführlich definiert. C ++ stellt virtuelles Erbe eine Zweideutigkeitsentschlossenheitseigenschaft genannt Überlegenheit aus.

Polymorphism

Polymorphism ermöglicht eine allgemeine Schnittstelle für viele Durchführungen, und für Gegenstände, verschieden unter verschiedenen Verhältnissen zu handeln.

C ++ unterstützt mehrere Arten von statischen (Übersetzungszeit) und dynamische (Durchlaufzeit) polymorphisms. Übersetzungszeit polymorphism berücksichtigt bestimmte Laufzeitentscheidungen nicht, während Durchlaufzeit polymorphism normalerweise eine Leistungsstrafe übernimmt.

Statischer polymorphism

Funktionsüberbelastung erlaubt Programmen, vielfache Funktionen zu erklären, die denselben Namen (aber mit verschiedenen Argumenten) haben. Die Funktionen sind durch die Zahl oder Typen ihrer formellen Rahmen bemerkenswert. So kann sich derselbe Funktionsname auf verschiedene Funktionen abhängig vom Zusammenhang beziehen, in dem er verwendet wird. Der durch die Funktion zurückgegebene Typ wird nicht verwendet, um überladene Funktionen zu unterscheiden, und würde auf eine Übersetzungszeit-Fehlermeldung hinauslaufen.

Wenn

er eine Funktion erklärt, kann ein Programmierer für einen oder mehr Rahmen einen Verzug-Wert angeben. Das Tun erlaubt so den Rahmen mit dem Verzug, fakultativ weggelassen zu werden, wenn die Funktion genannt wird, in welchem Fall die Verzug-Argumente verwendet werden. Wenn eine Funktion mit weniger Argumenten genannt wird als, dort werden Rahmen erklärt, ausführliche Argumente werden zu Rahmen in der zum Recht nach links Ordnung mit irgendwelchen unvergleichlichen Rahmen am Ende der Parameter-Liste verglichen, die ihre Verzug-Argumente wird zuteilt. In vielen Fällen ist das Spezifizieren von Verzug-Argumenten in einer einzelnen Funktionsbehauptung dem Versorgen überlasteter Funktionsdefinitionen mit verschiedenen Zahlen von Rahmen vorzuziehend.

Schablonen in C ++ stellen einen hoch entwickelten Mechanismus zur Verfügung, um allgemeinen, polymorphen Code zu schreiben. Insbesondere durch das Neugierig Wiederkehrende Schablone-Muster ist es möglich, eine Form von statischem polymorphism durchzuführen, der nah die Syntax nachahmt, um virtuelle Funktionen zu überreiten. Seitdem C ++ sind Schablonen des Typs bewusst und Turing-abgeschlossen, sie können auch verwendet werden, um den Bearbeiter rekursiven conditionals auflösen und wesentliche Programme durch die Schablone metaprogramming erzeugen zu lassen. Gegen eine Meinung wird Schablone-Code keinen Hauptteil-Code nach der Kompilation mit den richtigen Bearbeiter-Einstellungen erzeugen.

Dynamischer polymorphism

Erbe

Variable Zeigestöcke (und Verweisungen) zu einem Grundklassentyp in C ++ können sich auf Gegenstände irgendwelcher abgeleiteten Klassen dieses Typs zusätzlich zu Gegenständen beziehen, die genau den variablen Typ vergleichen. Das erlaubt Reihe und anderen Arten von Behältern, Zeigestöcke zu Gegenständen von sich unterscheidenden Typen zu halten. Weil die Anweisung von Werten zu Variablen gewöhnlich an der Durchlaufzeit vorkommt, ist das notwendigerweise ein Laufzeitphänomen.

C ++ stellt auch einem Maschinenbediener zur Verfügung, der dem Programm erlaubt, Konvertierung eines Gegenstands in einen Gegenstand einer spezifischeren Objektart sicher zu versuchen (im Vergleich mit der Konvertierung zu einem allgemeineren Typ, dem immer erlaubt wird). Diese Eigenschaft verlässt sich auf die Laufzeittyp-Information (RTTI). Gegenstände, die bekannt sind, eines bestimmten spezifischen Typs zu sein, können auch zu diesem Typ mit, rein Übersetzungszeit-Konstruktion geworfen werden, die schneller ist und RTTI nicht verlangt.

Virtuelle Mitglied-Funktionen

Normalerweise, wenn eine Funktion in einer abgeleiteten Klasse eine Funktion in einer Grundklasse überreitet, wird die Funktion zu rufen durch den Typ des Gegenstands bestimmt. Eine gegebene Funktion wird überritten, wenn dort kein Unterschied in der Zahl oder dem Typ von Rahmen zwischen zwei oder mehr Definitionen dieser Funktion besteht. Folglich, während der Übersetzung, kann es nicht möglich sein, den Typ des Gegenstands und deshalb der richtigen Funktion zu bestimmen, in Anbetracht nur eines Grundklassenzeigestocks zu rufen; die Entscheidung wird deshalb bis zur Durchlaufzeit beiseite gelegt. Das wird dynamische Absendung genannt. Virtuelles Mitglied fungiert, oder Methoden erlauben der spezifischsten Durchführung der Funktion, gemäß dem wirklichen Laufzeittyp des Gegenstands genannt zu werden. In C ++ Durchführungen wird das mit virtuellen Funktionstischen allgemein getan. Wenn die Objektart bekannt ist, kann das durch prepending ein völlig qualifizierter Klassenname umgangen werden, bevor der Funktionsanruf, aber in allgemeinen Anrufen zu virtuellen Funktionen in der Durchlaufzeit aufgelöst werden.

Zusätzlich zu Standardmitglied-Funktionen können Maschinenbediener-Überlastungen und destructors virtuell sein. Eine allgemeine Faustregel besteht darin, dass, wenn irgendwelche Funktionen in der Klasse virtuell sind, der destructor ebenso sein sollte. Weil der Typ eines Gegenstands bei seiner Entwicklung während der Übersetzung, Konstrukteure, und von Erweiterungskopie-Konstrukteuren bekannt ist, nicht virtuell sein kann. Dennoch kann eine Situation entstehen, wo eine Kopie eines Gegenstands geschaffen werden muss, wenn ein Zeigestock zu einem abgeleiteten Gegenstand als ein Zeigestock zu einem Grundgegenstand passiert wird. In solch einem Fall ist eine allgemeine Lösung, (oder ähnlich) virtuelle Funktion zu schaffen, die schafft und eine Kopie der abgeleiteten Klasse, wenn genannt, zurückgibt.

Eine Mitglied-Funktion kann auch "rein virtuell" durch das Befestigen davon mit nach der Schlussparenthese und vor dem Strichpunkt gemacht werden. Eine Klasse, die eine reine virtuelle Funktion enthält, wird einen abstrakten Datentyp genannt. Gegenstände können von abstrakten Datentypen nicht geschaffen werden; sie können nur abgeleitet werden. Jede abgeleitete Klasse erbt die virtuelle Funktion als rein und muss eine nichtreine Definition davon zur Verfügung stellen (und alle anderen reinen virtuellen Funktionen), bevor Gegenstände der abgeleiteten Klasse geschaffen werden können. Ein Programm, das versucht, einen Gegenstand einer Klasse mit einer reinen virtuellen Mitglied-Funktion zu schaffen, oder reine virtuelle Mitglied-Funktion geerbt hat, wird schlecht-gebildet.

Die Klasse, die rein eine virtuelle Funktion hat, wird eine abstrakte Klasse genannt.

Die Syntaxanalyse und die Verarbeitung C ++ Quellcode

Es ist relativ schwierig, einen guten C ++ parser mit klassischen Syntaxanalyse-Algorithmen wie LALR (1) zu schreiben. Das ist teilweise, weil der C ++ Grammatik nicht LALR ist. Wegen dessen gibt es sehr wenige Werkzeuge, um nichttriviale Transformationen (z.B, Wiederfactoring) des vorhandenen Codes zu analysieren oder durchzuführen. Eine Weise, diese Schwierigkeit zu behandeln, ist, eine verschiedene Syntax zu wählen. Stärkerer parsers, wie GLR parsers, kann (obwohl langsamer) wesentlich einfacher sein.

Die Syntaxanalyse (im wörtlichen Sinne, einen Syntax-Baum zu erzeugen), ist nicht das schwierigste Problem im Gebäude eines C ++ in einer Prozession gehendes Werkzeug. Solche Werkzeuge müssen auch dasselbe Verstehen der Bedeutung der Bezeichner im Programm haben, wie ein Bearbeiter haben könnte. Praktische Systeme, um C ++ zu bearbeiten, müssen dann den Quelltext nicht nur grammatisch analysieren, aber im Stande sein, sich für jeden Bezeichner genau aufzulösen, den Definition anwendet (z.B, müssen sie C ++ 's Komplex scoping Regeln richtig behandeln), und was sein Typ, sowie die Typen von größeren Ausdrücken ist.

Schließlich ein praktischer C ++ muss in einer Prozession gehendes Werkzeug im Stande sein, die Vielfalt von C ++ zu behandeln, Dialekte verwendet in der Praxis (wie das, das durch die GNU-Bearbeiter-Sammlung und diesen der Visuellen C des Microsofts ++ unterstützt ist) und Werkzeug, verwenden Analysatoren, Quellcodetransformatoren, und regenerieren Quelltext. Das Kombinieren fortgeschrittener Syntaxanalyse-Algorithmen wie GLR mit dem Symbol-Tabellenaufbau und der Programm-Transformationsmaschinerie kann den Aufbau von willkürlichem C ++ Werkzeuge ermöglichen.

Vereinbarkeit

Wenn er

einen vernünftig standardentgegenkommenden C ++ erzeugt, hat sich Bearbeiter erwiesen, eine schwierige Aufgabe für Bearbeiter-Verkäufer im Allgemeinen zu sein. Viele Jahre lang hat verschiedener C ++ Bearbeiter den C ++ Sprache zu verschiedenen Niveaus des Gehorsams zum Standard und ihre Durchführungen geändert weit in einigen Gebieten wie teilweise Schablone-Spezialisierung durchgeführt. Neue Ausgaben von populärstem C ++ Bearbeiter unterstützen fast alle C ++ 1998-Standard.

Um Bearbeiter-Verkäufern größere Freiheit, der C ++ zu geben, hat sich Standardkomitee dafür entschieden, die Durchführung des Namens zerfleischend, das Ausnahme-Berühren und die anderen mit der Durchführung spezifischen Eigenschaften nicht zu diktieren. Die Kehrseite dieser Entscheidung ist, dass, wie man erwartet, durch verschiedene Bearbeiter erzeugter Gegenstand-Code unvereinbar ist. Es, gab jedoch, Versuche, Bearbeiter für besondere Maschinen oder Betriebssysteme zu standardisieren (zum Beispiel C ++ ABI), obwohl sie scheinen, jetzt größtenteils aufgegeben zu werden.

Exportierte Schablonen

Ein besonderer Punkt des Streits ist das Schlüsselwort, beabsichtigt, um Schablone-Definitionen zu erlauben, von ihren Behauptungen getrennt zu werden. Der erste weit verfügbare Bearbeiter, um durchzuführen, war Comeau C/C ++, Anfang 2003 (fünf Jahre nach der Ausgabe des Standards); 2004 wurde der Beta-Bearbeiter von Borland C ++ Baumeister X auch damit veröffentlicht. Beide dieser Bearbeiter basieren auf dem EDG C ++ Vorderende. Andere Bearbeiter wie GCC unterstützen es überhaupt nicht. durch Ivor Horton versorgt Beispiel-Code mit dem Schlüsselwort, das in den meisten Bearbeitern ohne Berücksichtigung dieses Problems nicht kompilieren wird. Herb Sutter, ehemaliger convener des C ++ Standardkomitee, hat empfohlen, dass von zukünftigen Versionen des C ++ Standard entfernt werden. Während des Märzes 2010 ISO C ++ Standardsitzung der C ++ hat Standardkomitee gestimmt, um exportierte Schablonen völlig von C ++ 0x zu entfernen, aber das Schlüsselwort für den zukünftigen Gebrauch vorzubestellen.

Mit C

C ++ wird häufig betrachtet, eine Obermenge von C zu sein, aber das ist nicht ausschließlich wahr. Der grösste Teil des C-Codes kann leicht gemacht werden, richtig in C ++ zu kompilieren, aber es gibt einige Unterschiede, die einen gültigen C-Code veranlassen, ungültig zu sein oder sich verschieden in C ++ zu benehmen.

Ein allgemein gestoßener Unterschied ist, dass C implizite Konvertierung von anderen Zeigestock-Typen erlaubt, aber C ++ tut nicht. Ein anderes allgemeines Beweglichkeitsproblem ist, dass C ++ viele neue Schlüsselwörter, solcher als definiert und, der als Bezeichner (z.B Variablennamen) in einem C Programm verwendet werden kann.

Einige Inkompatibilitäten sind durch die 1999-Revision des C Standards (C99) entfernt worden, der jetzt C ++ Eigenschaften wie Linienanmerkungen , und gemischte Behauptungen und Code unterstützt. Andererseits hat C99 mehrere neue Eigenschaften eingeführt, die C ++, wie Reihe der variablen Länge, heimische Typen der komplexen Zahl, benannte Initialisierungsprogramme und zusammengesetzte Druckfehler nicht unterstützt hat. Jedoch wurden mindestens einige der C99-eingeführten Eigenschaften in die nachfolgende Version des C ++ Standard, C ++ 11 eingeschlossen:

  • C99 Vorverarbeiter (einschließlich variadic Makros, breiter/schmaler wörtlicher Verkettung, breiterer Arithmetik der ganzen Zahl)
  • Kopfbälle:
  • .

Um C und C ++ Code zu vermischen, müssen jede Funktionsbehauptung oder Definition, die sowohl von/verwendet in C als auch von/verwende C ++ genannt werden soll, mit der C Verbindung durch das Stellen davon innerhalb eines Blocks erklärt werden. Solch eine Funktion kann sich auf Eigenschaften abhängig vom Namen zerfleischend (d. h., Funktionsüberbelastung) nicht verlassen.

Kritik

Wegen seiner großen Merkmalsreihe und oft wahrgenommener "strenger" Syntax wird die Sprache manchmal als kritisiert allzu kompliziert werden und so schwierig völlig dem Master. Weil es den grössten Teil der C Programmiersprache einschließt, weil eine Teilmenge, C ++ auch viele der an C geebneten Kritiken erbt.

Anderer Kritik-Stamm von fehlenden Eigenschaften von C ++ 's Standardbibliothek, wie der Mangel an "heimischen" Nebenläufigkeitsmöglichkeiten — eine Eigenschaft-Gegenwart auf einigen anderen Sprachen, einschließlich Adas, C#, und Java (sieh Schloss). Im spezifischen Fall der Nebenläufigkeit korrigiert die neuste Revision zum Standard, C ++ 11, diese Weglassung.

C ++ wird auch manchmal ungünstig mit Sprachen wie Eiffel, Java oder Plausch auf der Basis verglichen, dass es Programmierern ermöglicht,", allgemeine, funktionelle, Aussage-Modul- und Verfahrensprogrammierstile mit der objektorientierten Programmierung "zu mischen und zu vergleichen, anstatt einen einzelnen Stil ausschließlich geltend zu machen, obwohl C ++ absichtlich eine Mehrparadigma-Sprache ist.

Ein weit verteilter satirischer Artikel hat Bjarne Stroustrup porträtiert, der für ein 1998-Problem der Zeitschrift Computer von IEEE interviewt ist, bekennend, dass C ++ absichtlich entworfen wurde, um kompliziert und schwierig zu sein, Amateurprogrammierer aussondernd und die Gehälter der wenigen Programmierer erhebend, die die Sprache meistern konnten. Die Abteilung der häufig gestellten Fragen der persönlichen Website von Stroustrup enthält eine Leugnung und eine Verbindung zum wirklichen Interview.

Richard Stallman kritisiert C ++ dafür, zweideutige Grammatik und "unentgeltliche, triviale Inkompatibilitäten mit C zu haben [...], die von keinem großen Vorteil sind".

Linus Torvalds hat gesagt, "C ++ ist eine schreckliche Sprache. Es hat schrecklicher durch die Tatsache gemacht, dass viele Kleinprogrammierer es verwenden".

Ein anderer Punkt der Kritik ist die Eigenschaft der Mehrfachvererbung, weil solche Ontologie schwierig ist aufrechtzuerhalten.

Bjarne Stroustrup hat dass festgestellt:

Schließlich haben mehrere Autoren bemerkt, dass C ++ nicht eine wahre objektorientierte Sprache ist.

Siehe auch

  • Der C ++ Programmiersprache
  • Vergleich von einheitlichen Entwicklungsumgebungen für C/C ++
  • Vergleich von Programmiersprachen
  • Liste von C ++ Bearbeiter
  • Liste von C ++ Schablone-Bibliotheken
  • Vergleich Javas und C ++
  • C ++ Standardbibliothek

Weiterführende Literatur

Links


Geschichte des Baseballs außerhalb der Vereinigten Staaten / Röntgenstrahl-Fluoreszenz
Impressum & Datenschutz