C ++
C ++ | |
---|---|
![]() | |
Basis data | |
paradigma's : | Multiparadigma's ( generiek , imperatief , objectgericht , procedureel , gestructureerd , functioneel ) |
Jaar van uitgave: | 1985 |
Ontwerper: | Bjarne Stroustrup |
Ontwikkelaar: | Bjarne Stroustrup |
Huidige versie : | C++ 17 (1 december 2017) |
Huidige voorlopige versie: | C++ 20 [1] () |
Typen : | statisch (dynamische typecontrole mogelijk) , impliciet, sterk |
Belangrijke implementaties : | C ++ Builder , GCC , MS Visual C ++ , Intel C ++ Compiler , Clang / LLVM |
Standaardisaties: | ISO / IEC 14882: 1998, ISO / IEC 14882: 2003, ISO / IEC TR 19768: 2007, ISO/IEC 14882:2011 ISO / IEC 14882: 2014 [2] ISO / IEC 14882: 2017 [3] |
Beïnvloed door: | C , Simula , Ada , ALGOL 68 , CLU , ML |
Aangedaan: | Ada 95 , Chapel , C # , D , Go , Java , Nim , Perl , PHP , Python [4] , Vala , Rust , Seed7 |
isocpp.org |
C++ is een programmeertaal die gestandaardiseerd is door de ISO . Het werd vanaf 1979 ontwikkeld door Bjarne Stroustrup bij AT&T als een uitbreiding van de programmeertaal C. C++ maakt zowel efficiënt en machinegericht programmeren als programmeren op een hoog abstractieniveau mogelijk. De standaard definieert ook een standaardbibliotheek waarvoor verschillende implementaties bestaan.
Toepassingsgebieden
C++ wordt zowel bij systeemprogrammering als bij applicatieprogrammering gebruikt en is op beide gebieden een van de meest populaire programmeertalen. [5]
Systeemprogrammering
Typische toepassingsgebieden bij systeemprogrammering zijn besturingssystemen , embedded systemen , virtuele machines , stuurprogramma's en signaalprocessors . C++ neemt vaak de plaats in die voorheen exclusief was voorbehouden aan assemblertalen en de programmeertaal C.
Applicatieprogrammering
Bij applicatieprogrammering wordt C++ vooral gebruikt waar hoge eisen worden gesteld aan efficiëntie om zo optimaal mogelijk gebruik te maken van de prestatiegrenzen die door technische randvoorwaarden worden gesteld. Vanaf het jaar 2000 werd C++ door de talen Java en C# teruggedrongen uit het domein van applicatieprogrammering.
eigenschappen
Taalontwerp
De C++-taal gebruikt slechts ongeveer 60 sleutelwoorden ("taalkern"), sommige worden meerdere keren in verschillende contexten gebruikt ( static
, default
). Het ontvangt zijn eigenlijke functionaliteit, vergelijkbaar met de C-taal, van de C ++ standaardbibliotheek , die de taal voorziet van ontbrekende belangrijke functionaliteiten (arrays, vectoren, lijsten, ...) en de verbinding met het besturingssysteem tot stand brengt ( iostream, fopen, exit , ...). Afhankelijk van het toepassingsgebied worden aanvullende bibliotheken en frameworks toegevoegd. C ++ richt zich op de taalbronnen voor het ontwikkelen van bibliotheken. Als gevolg hiervan geeft het de voorkeur aan algemene mechanismen voor typische problemen en heeft het nauwelijks individuele oplossingen die in de taal zijn geïntegreerd.
Een van de sterke punten van C++ is de mogelijkheid om efficiënt programmeren op laag niveau te combineren met krachtige taalbronnen die eenvoudige tot complexe implementatiedetails samenvatten en grotendeels verbergen achter abstracte commandoreeksen. Hier komt sjabloonmetaprogrammering om de hoek kijken : een techniek die een bijna compromisloze combinatie van efficiëntie en abstractie mogelijk maakt.
Sommige ontwerpbeslissingen worden echter ook vaak bekritiseerd:
Hulpbronnenbeheer
C++ heeft geen garbagecollection , maar er worden inspanningen geleverd om garbagecollection mogelijk te maken via bibliotheken of door opname in de taalstandaard.[6] [7] [8] Zie ook Boehm Vuilnisophaling .
Het is echter mogelijk om het geheugen in het programma te beheren; het is noodzakelijk om bibliotheken op laag niveau te implementeren, zoals de standaardbibliotheek van C++. Dit wordt echter sterk afgeraden in code op hoog niveau. [9]
In plaats daarvan is het daar gebruikelijk om de C++-standaardbibliotheek het geheugenbeheer te laten overnemen door gebruik te maken van de aangeboden containerklassen. Andere middelen, b.v. B. Bestandshandles of netwerksockets worden in C++ meestal beheerd in aparte klassen met het RAII- principe om te zorgen voor automatische opruiming na gebruik.
Als je zelf naar andere objecten verwijst in objecten, werk je meestal met slimme pointers als alternatief voor een garbage collector, die vervolgens het resourcebeheer overneemt. Intern gebruikt de standaardbibliotheek meestal referentietelling . [10]
Onvolledige objectoriëntatie
Zichtbaarheid van privé-elementen
In C ++ maken privé-eigenschappen (variabelen en methoden) meestal deel uit van de interface, die wordt gepubliceerd in het headerbestand. Dit creëert afhankelijkheden tussen de objecten en de locaties die ze gebruiken tijdens het compileren en runtime .
Deze afhankelijkheden kunnen worden vermeden door bepaalde constructies te gebruiken, zoals het pimpl-idioom ( pointer naar implementatie-idioom ). De private velden van de klasse ( example_class ) worden verplaatst naar een private, forward-gedeclareerde hulpklasse , en een pointer naar een object van deze hulpklasse ( example_class :: impl * impl_ptr ) blijft in de eigenlijke klasse. De definitie van de implementerende klasse vindt plaats wanneer de openbare klasse is geïmplementeerd en is daarom onzichtbaar voor de gebruiker van de klasse (die alleen het headerbestand kent). Omdat er alleen naar de hulpklasse wordt verwezen door een aanwijzer, blijven alle wijzigingen in de broncode in privévelden transparant en blijft de binaire compatibiliteit behouden. [11]
Onvolledige inkapseling
In C++ zijn de geheugengebieden van de afzonderlijke objecten tijdens runtime niet beschermd tegen (opzettelijke of onbedoelde) onderlinge wijzigingen.
Ongedefinieerd gedrag
Het gedrag van sommige taalconstructies is niet gedefinieerd. Dit betekent dat de norm niet voorschrijft of aanbeveelt wat er in zo'n geval gebeurt. De effecten variëren van implementatieafhankelijkheid (dwz de constructie kan zich anders gedragen, afhankelijk van de doelcomputer en compiler) tot onzinnige resultaten of programmacrashes tot beveiligingslekken. Sommige van deze vrijheden van de compiler maken aanvullende optimalisaties van de code mogelijk.
Er zijn verschillende gedragingen
- verschillende compilers
- verschillende compilerversies
- verschillende architectuur ( ARM , x86 , x64 )
- verschillende optimalisatie-instellingen (debug, release, optimalisatie)
- Geselecteerde instructieset , belconventies en nog veel meer
Broncode met codepassages met ongedefinieerd gedrag kan na compilatie onverwacht en absurd gedrag vertonen. Te laat uitgevoerde controles worden weggeoptimaliseerd of lussen die toegang hebben tot een ongeldige index van een array worden vervangen door lege eindeloze lussen. [12] [13]
Om ongedefinieerd gedrag te begrijpen, is het vooral belangrijk dat een enkele bewerking nooit ongeldig is, maar dat het hele programma ongeldig wordt en niet langer goed gevormde C++ vertegenwoordigt. De reden is dat sommige soorten "ongedefinieerd gedrag" effecten hebben op geheel verschillende delen van het programma, ook die welke op zichzelf correct zijn, en hun gedrag kunnen beïnvloeden, bijvoorbeeld in het geval van bufferoverloop of het onbedoeld wijzigen van processorvlaggen veroorzaakt door een ongeldige rekenkundige bewerking en kan de volgende berekeningen beïnvloeden.
Voorbeelden van ongedefinieerd gedrag :
- Overloop van ondertekende gehele getallen (ook bijv. bij het converteren van
unsigned int
naarint
) - Null pointer verwijzing
- Matrixtoegang met ongeldige index
- Shift-bewerkingen met een verschuivingsbreedte die negatief is of groter is dan of gelijk is aan het aantal bits van het type dat moet worden verschoven
- Delen door nul met integrale gegevenstypen
- Het weglaten van de
return
instructie in functies met een return-waarde (de hoofdfunctiemain
is de enige uitzondering) - Een bijwerking verandert een variabele die meerdere keren voorkomt in de uitdrukking (
v[i] = i++;
) of in de lijst met argumenten (f(i, i++);
) (de volgorde van evaluatie van gedeeltelijke uitdrukkingen en functie argumenten staat niet vast)
Enerzijds is het resulterende niet-deterministische runtime-gedrag, vooral bij kleine wijzigingen aan het platform, op zijn minst als risico te classificeren, maar in de praktijk is het vaak een duidelijk nadeel. Aan de andere kant maakt dit snellere programma's mogelijk, aangezien validiteitscontroles kunnen worden weggelaten en de compiler ook vaak programmaonderdelen in grotere mate kan optimaliseren door randgevallen te negeren die per definitie zijn uitgesloten.
Een ander voordeel, dat vaak niet wordt waargenomen, is dat ongedefinieerd gedrag praktisch alleen voorkomt in uiterst twijfelachtige constructies, die echter niet noodzakelijkerwijs kunnen worden vastgesteld tijdens het compileren, waardoor in feite niet-semantische of anderszins suboptimale code wordt verboden.
Er is bijvoorbeeld een illegale manier om te controleren of de som van twee positieve gehele getallen is en van het type 'int' kunnen zonder verlies opnieuw in een 'int' worden afgebeeld, door te kijken of hun som groter is dan 0 (bij overflow resulteert de twee-complement- berekening op de meeste computers in een negatief getal). Een dergelijke controle is wiskundig gezien niet bijzonder zinvol. Een betere (meer semantische) benadering hier is de echte vraag of , waarin het grootste getal dat kan worden weergegeven in een 'int' is, na de wiskundig geldige conversie naar gebruiken. [14]
Compatibiliteit met C
Om aan te sluiten bij de verspreiding van de programmeertaal C is C++ conform de status van 1990 ( ISO/IEC 9899: 1990 , ook wel kortweg C90 genoemd) als uitbreiding van C ontworpen.
Compatibiliteit met C dwingt C ++ om door te gaan met enkele van de nadelen die het heeft geërfd. Dit omvat de soms moeilijk te begrijpen C-syntaxis, de preprocessor , die als verouderd wordt beschouwd, en verschillende details van de taal, afhankelijk van het respectievelijke platform, die het overzetten van C++-programma's tussen verschillende computertypen, besturingssystemen en compilers moeilijk maken.
Sommige C-taalconstructies hebben een iets andere betekenis of syntaxis in C++, zodat sommige C-programma's eerst moeten worden aangepast om als C++-programma's gecompileerd te kunnen worden. Verdere wijzigingen in C vonden plaats in 1999 ( ISO / IEC 9899: 1999 , ook bekend als C99) en 2011 ( ISO / IEC 9899: 2011 , ook bekend als C11), dwz na de eerste standaardisatie van C ++, zodat wijzigingen die zijn opgenomen er niet zijn in C++ 98 zou kunnen worden overwogen. Sommige van de nieuwe functies van C99 zijn overgenomen in de C++-revisie van 2011; aan de andere kant zijn er nieuwe functies toegevoegd aan de C-standaard die ook niet compatibel zijn met C++11.
Taalfuncties in detail
C++ is gebaseerd op de programmeertaal C zoals beschreven in ISO /IEC 9899: 1990. Naast de opties die beschikbaar zijn in C, biedt C++ nog meer datatypes en nieuwe typeconversie-opties, klassen met meerdere overervings- en virtuele functies , exception handling , templates , namespaces , inline-functies , overbelasting van operators en functienamen, referenties , operators voor het beheren van dynamisch geheugen en een uitgebreide bibliotheek met de C++ standaardbibliotheek .
Voorbeeld programma
De volgende broncode is een eenvoudig C++- programma dat de tekst "Hallo wereld!" schrijft naar de standaard uitvoerstroom , meestal de terminal :
#include <iostream>
int hoofd () {
std :: cout << "Hallo wereld!" << std :: endl;
retourneer 0 ;
}
Het preprocessor-commando of preprocessor-instructie met de naam #include
bevat headerbestanden die doorgaans declaraties van variabelen, typen en functies bevatten. In tegenstelling tot C hebben headers van de C++ standaardbibliotheek geen bestandsextensie.
De header <iostream>
maakt deel uit van de C++ standaardbibliotheek en declareert onder andere de standaard std::cerr
std::cin
en de standaard std::cerr
std::cout
en std::cerr
voor de objecten stdin
, stdout
en stderr
bekend uit de C-standaardbibliotheek.
main()
is de functie die het beginpunt is van elk C++-programma. Het programma wordt uitgevoerd door de main()
aan te roepen, die op zijn beurt andere functies kan aanroepen. De main()
zelf mag echter niet recursief worden aangeroepen in een C++-programma.
De standaard vereist dat implementaties twee handtekeningen voor de main()
: een zonder functieparameters zoals in het voorbeeld, en een die een geheel getal en een aanwijzer naar een aanwijzer naar char
accepteert om toegang te krijgen tot opdrachtregelparameters (die is niet mogelijk in alle benodigde Programma's): int main(int argc, char **argv)
. Implementaties kunnen ook andere handtekeningen voor main()
, maar ze moeten allemaal het retourtype int
( integer ) hebben, d.w.z. een integer retourneren. Als main()
geen waarde heeft geretourneerd, vereist de C++-standaard dat de implementatie return 0;
accepteren. main()
retourneert 0 als er geen andere return
instructie in staat. [15]
std::cout
is een instantie van de std::basic_ostream<char>
, die, net als de hele C++-standaardbibliotheek, zich in de std
naamruimte bevindt . Identifiers in naamruimten worden geadresseerd met de range-operator ( ::
:).
De operator <<
neemt de uitvoer van de tekenreeks letterlijk "Hallo Welt"
. In C ++ zijn letterlijke tekenreeksen van het arraytype dat bestaat uit N constante tekens ( char const[N]
), waarbij N gelijk is aan de lengte van de tekenreeks + 1 voor de uiteindelijke nulbeëindiging . Aangezien de standaard typeconversies van C ++ voorzien in de impliciete conversie van een array T[N]
in een pointer T*
, bekend als pointer-naar-array-verval , en zodat char const[N]
ontleed in char const*
, het overbelaste operatorsjabloon template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *);
fits template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *);
van <ostream>
en wordt dienovereenkomstig aangeroepen ( operator<<( std::cout, "Hallo Welt!" );
) en voert de tekenreeks uit. De uitvoermanipulator std::endl
een einde- std::endl
.
Met return 0
wordt het aanroepende programma via het besturingssysteem geïnformeerd dat de uitvoering van het programma succesvol was.
Bestandsextensies
Typische bestandsextensies zijn .C, .cc, .cpp, .cxx, .c ++ , .h, .hh, .hpp, .hxx, .h ++ , .ipp, .tpp.
implementatie
C++-compiler
De implementatie van een C++ compiler wordt als complex ervaren. Nadat de taalstandaard in 1998 was voltooid, duurde het enkele jaren voordat de taal grotendeels werd ondersteund door C++-compilers.
De meest populaire C++-compilers zijn onder meer:
- Visueel C ++
- De compiler in Microsoft Visual C++ wordt het meest gebruikt voor het Windows- besturingssysteem. Microsoft biedt de Community-editie gratis aan.
- GCC
- De g++ is de C++-versie van de GNU Compiler Collection (GCC); g++ is open source en vrij beschikbaar. De g++ ondersteunt een verscheidenheid aan besturingssystemen (waaronder Unix , Linux , macOS , Windows en AmigaOS ) en processorplatforms. GNU C++ bestaat al sinds 1987 en is daarmee een van de oudste C++ compilers. [16]
- Intel C++-compiler
- De Intel C++ compiler maakt ook gebruik van de genoemde C++ front-end van EDG. De Intel C++ Compiler genereert machinecode voor de Intel- processors onder de besturingssystemen Windows, Linux en macOS. Omdat de programma's die met de Intel C++-compiler worden gegenereerd bijzonder goed gebruik maken van de instructieset van de Intel-processors, genereren ze bijzonder efficiënte programma's voor dit platform. (Compilaties van de Intel-compiler draaien meestal ook sneller op AMD-chips dan compilaties van de alternatieve compilers, maar Intel vergrendelt de bijbehorende optimalisatievlaggen, waardoor de vergrendeling kan worden opgeheven.) De Intel C++-compiler gebruikt essentiële onderdelen van de g++ in de onderbouw en vervangt en breidt delen van code-optimalisatie en codegeneratie uit.
- Clang
- Clang , een front-end voor de door Apple gepromoot cross-platform compiler- infrastructuur LLVM , die onder andere ook wordt gebruikt in de geïntegreerde ontwikkelomgeving Xcode . [17]
- Oracle Solaris Studio
- Oracle Solaris Studio ( Wikipedia entry ) is gratis verkrijgbaar bij Oracle. [18]
- Comeau C ++
- De Comeau C++ . De zogenaamde "front-end" van de compiler, d.w.z. het deel dat de analysefase implementeert, is ontwikkeld door de Edison Design Group (EDG), die gespecialiseerd is in de ontwikkeling van compiler-frontends en hun C++ - Front-end is ook ingebouwd in veel andere commerciële C++-compilers. De Comeau compiler kan ook op internet worden uitgeprobeerd.
- Turbo C ++
- Een andere compiler is beschikbaar met Turbo C++ / C++ Builder . [19]
Geïntegreerde ontwikkelomgevingen
Gratis ontwikkelomgevingen
- Anyuta
- Arduino
- CodeLite
- Code :: Blokken
- Verduistering
- Geany
- GNAT-programmeerstudio
- KOntwikkelen
- MonoDevelop
- NetBeans IDE
- Orwell Dev-C ++
- Qt Creator
- TOPKAST
- Ultiem ++
- Wide Studio
Eigen ontwikkelomgevingen
- C++ Builder
- CLion (gebaseerd op IntelliJ IDEA )
- CodeWarrior
- Concept 16 (programmeertaal vergelijkbaar met C++)
- Kubieke IDE
- ICOON-L
- Kylix
- Visuele studio
- Xcode
Vergelijking met andere talen
Doelstelling C
C ++ was niet de enige benadering om functies aan de C-programmeertaal toe te voegen die objectgeoriënteerd programmeren vereenvoudigen. In de jaren 80 werd de programmeertaal Objective-C gecreëerd die, in tegenstelling tot C++, zowel syntax als functioneel principe gebaseerd was op Smalltalk en niet op Simula . De syntaxis van Objective-C (C beïnvloed door Smalltalk) verschilt aanzienlijk van C ++ (C beïnvloed door Simula met zijn eigen syntactische extensies). Eind jaren tachtig werd Objective-C voor het eerst commercieel gebruikt in NeXTStep , waarin het een centraal onderdeel is. Tegenwoordig wordt het zowel in de programmeerinterface OpenStep (of Cocoa en GNUstep ) als in de besturingssystemen iOS en macOS gebruikt .
Java en C#
De programmeertalen Java en C # hebben een vergelijkbare syntaxis, ook gebaseerd op C, aangezien C ++, [20] ook objectgeoriënteerd zijn en al enige tijd typeparameters hebben ondersteund. Ondanks externe overeenkomsten, verschillen ze in sommige gevallen conceptueel aanzienlijk van C++.
Generieke technieken vullen objectgeoriënteerd programmeren aan met typeparameters en vergroten zo de herbruikbaarheid van eenmalig gecodeerde algoritmen. De generieke Java-extensies zijn echter alleen van toepassing op klassen, niet op primitieve typen of gegevensconstanten. Daarentegen omvatten de generieke taaluitbreidingen van C # ook de primitieve typen. Dit is echter een uitbreiding voor generieke geneesmiddelen tijdens runtime, die de C++-sjablonen die zijn afgestemd op de compilatietijd nuttig kunnen aanvullen, maar ze niet kunnen vervangen.
Vooral generieke programmering maakt C++ tot een krachtige programmeertool. Terwijl objectgeoriënteerd programmeren in Java en C# nog steeds het centrale abstractiemechanisme is, is dit type programmeren in C++ aan het afnemen. Op deze manier worden diepe klassenhiërarchieën vermeden, en ten gunste van efficiëntie en het minimaliseren van het verbruik van hulpbronnen, wordt polymorfisme , een van de fundamentele componenten van objectgeoriënteerd programmeren, in veel gevallen achterwege gelaten.
Creatie en verdere ontwikkeling
Geschiedenis van oorsprong
Stroustrup kwam op het idee voor een nieuwe programmeertaal door ervaring met de programmeertaal Simula tijdens zijn promotieonderzoek aan de Universiteit van Cambridge . Simula bleek geschikt voor gebruik in grote softwareprojecten, maar de structuur van de taal maakte het moeilijk om zeer efficiënte programma's te maken . Daarentegen konden efficiënte programma's worden geschreven met de BCPL- taal, maar BCPL was opnieuw ongeschikt voor grote projecten.
Met de ervaring van zijn proefschrift breidde Stroustrup de programmeertaal C vanaf 1979 uit bij AT&T Bell Laboratories als onderdeel van onderzoeken naar de Unix- besturingssysteemkernel met betrekking tot gedistribueerd computergebruik . De C programmeertaal werd gekozen omdat C werd een algemene taal die snel geproduceerd code en was gemakkelijk poort naar andere platforms. Als de taal die het Unix-besturingssysteem vergezelt, werd C ook veel gebruikt.
Een van de eerste uitbreidingen was een klassenconcept met gegevensinkapseling, waarvoor de Simula-67- taal het primaire model was. Dan waren er afgeleide klassen, een strenger typesysteem , inline-functies en standaardargumenten.
Terwijl Stroustrup bezig was met het ontwikkelen van C met Classes (wat later C++ werd), schreef hij ook cfront , een compiler die aanvankelijk C-code genereerde als een tussenresultaat van C with Classes . De eerste commerciële versie van cfront verscheen in oktober 1985.
In 1983 werd C with Classes omgedoopt tot C++ . Uitbreidingen waren: overbelasting van functienamen en operators, virtuele functies, referenties, constanten, een veranderlijk heapbeheer en een verbeterde typecontrole. De mogelijkheid van opmerkingen die aan het einde van een regel zijn gekoppeld, is overgenomen van BCPL ( //
).
In 1985 verscheen de eerste versie van C++, wat een belangrijke referentieversie was omdat de taal toen nog niet gestandaardiseerd was. In 1989 verscheen versie 2.0 van C++. Nieuw daarin waren meervoudige overerving , abstracte klassen, statische lidfuncties, constante lidfuncties en de uitbreiding van het toegangsmodel met protected
. In 1990 verscheen het boek The Annotated C++ Reference Manual , dat als basis diende voor het daaropvolgende standaardisatieproces.
Sjablonen , afhandeling van uitzonderingen , naamruimten , conversies van nieuwe typen en Booleaanse typen werden relatief laat aan de taal toegevoegd.
In de loop van de verdere ontwikkeling van de C++-taal werd ook een standaardbibliotheek gecreëerd die ten opzichte van C werd uitgebreid. De eerste toevoeging was de Stream I/O-bibliotheek , die de traditionele C-functies zoals printf()
en scanf()
vervangt. Een van de belangrijkste verbeteringen aan de standaardbibliotheek kwam later door de integratie van grote delen van de door Hewlett-Packard ontwikkelde Standard Template Library ( STL ).
standaardisatie
Na jaren werk werd in 1998 de definitieve versie van de C++-taal (ISO/IEC 14882:1998) eindelijk gestandaardiseerd. Achteraf gezien, toen andere versies van de taal verschenen, heette deze versie ook C ++ 98 . In 2003 werd ISO / IEC 14882: 2003 aangenomen, een wijziging van de norm uit 1998 die enkele misverstanden wegnam en verschillende details verduidelijkte. Deze versie is in de volksmond ook bekend als C++ 03 .
Verdere ontwikkeling van de programmeertaal C++ na 2005
Om gelijke tred te houden met de huidige ontwikkelingen in snel veranderende computertechnologie, maar ook om bekende zwakke punten te corrigeren, ontwikkelde de C++-standaardisatiecommissie de volgende grote herziening van C++, die officieus werd afgekort tot C++ 0x , waarin de reeks cijfers was een ruwe. Zou een schatting moeten geven van de mogelijke publicatiedatum. Later, toen een releasedatum niet meer kon worden aangehouden tot eind 2009, werd de onofficiële naam gewijzigd in C++ 1x .
De primaire doelen voor de verdere ontwikkeling van C++ waren verbeteringen op het gebied van systeemprogrammering en het creëren van programmabibliotheken. Daarnaast moet de leerbaarheid van de taal voor beginners worden verbeterd.
In november 2006 werd de streefdatum voor voltooiing vastgesteld voor 2009. In juli 2009 is deze datum op zijn vroegst gewijzigd in 2010. In augustus 2011 werd de herziening unaniem goedgekeurd door ISO [21] en officieel gepubliceerd op 11 oktober 2011 als ISO/IEC 14882:2011. [22] [23] Officieus heet de versie C ++ 11 .
Verbeteringen aan de taalkern
C ++ 98 dekte nog niet voldoende enkele typische probleemgebieden in programmeren af, bijvoorbeeld de ondersteuning van concurrency ( threads ), waarvan de integratie in C ++, vooral voor gebruik in omgevingen met meerdere processors, een herziening van de taal onvermijdelijk maakte. Door de introductie van een geheugenmodel zijn garanties van de taal voor de concurrente operatie vastgesteld om zowel onduidelijkheden in de verwerkingsvolgorde op te lossen als deze in bepaalde gevallen te behouden, waardoor ruimte voor optimalisatie ontstaat.
Tot de bredere taaluitbreidingen behoorde verder de automatische typeafgeleide voor het afleiden van resultaatsoorten van uitdrukkingen en de zogenaamde R-waardereferenties, als aanvulling op de bestaande kopieerobjecten en het verschuiven met behulp waarvan, ook op bereik gebaseerde for-loops ( foreach ) via containers en ingebouwde velden. [24]
Uitbreiding van de programmabibliotheek
In april 2006 heeft de C++-standaardisatiecommissie het zogenaamde eerste technische rapport (TR1) gepubliceerd, een niet-normatieve aanvulling op de momenteel geldende bibliotheek die in 1998 is gedefinieerd, waarmee uitbreidingsvoorstellen op hun praktische geschiktheid moeten worden onderzocht voordat ze kan worden overgebracht naar de C++-standaardbibliotheek . Veel compilerfabrikanten hebben de TR1 bij hun producten geleverd.
De TR1 omvatte reguliere expressies , [25] verschillende intelligente pointers , [26] ongeordende associatieve containers , [27] een bibliotheek met willekeurige getallen, [28] tools voor C++ metaprogrammering, tupels [29] en numerieke en wiskundige bibliotheken. [30] De meeste van deze verbeteringen kwamen uit de Boost-bibliotheek waaruit ze met minimale wijzigingen werden overgenomen. Bovendien werden alle bibliotheekuitbreidingen van de programmeertaal C (C99), die in 1999 werd herzien, opgenomen in een aan C++ aangepaste vorm. [31]
Met uitzondering van de numerieke en wiskundige bibliotheken, zijn alle TR1-extensies opgenomen in de C++ 11-taalstandaard. Er is ook een aparte bibliotheek geïntroduceerd om threads te ondersteunen.
C++ 11
Mit der Norm ISO/IEC 14882:2011, auch bekannt als C++11 , wurden viele weitreichende Neuerungen in C++ eingeführt, wie auszugsweise:
- Lambdas ( Anonyme Funktionen ), welche vor der Verabschiedung des C++11 -Standards in anderen Sprachen schon teils breite Anwendung fanden, erweitern die Sprache vor allem im Bereich der funktionalen Programmierung.
- Eine erleichterte Typbehandlung mit Typinferenz ist nun über das Schlüsselwort
auto
(das nun nicht mehr ein Speicherklassen-Specifier ist) einerseits und das Schlüsselwortdecltype
(das den Typ eines Ausdrucks statisch zur Compilezeit zurückgibt, sofern ermittelbar) andererseits möglich. Beide Schlüsselworte zeigen ihre Stärke zudem auch im Verbund. So können ganze Funktionen, deren Rückgabetypen beispielsweise nur schwer vom Programmierer einzusehen sind, weil sie beispielsweise innerhalb komplexerer Klassentemplates liegen, komfortabel definiert werden:template < typename Factory > auto createObject ( const Factory & creator ) -> decltype ( creator . makeObject ()) { return creator . makeObject (); }
- Streng typisierte
enum
s (enum class
) beseitigen Probleme mit Namenskollisionen und schränken die Fehleranfälligkeit in Bezug auf implizite Typkonvertierungen ein. - Sogenannte "range-based loops" mittels eines modifizierten
for
-Statements erleichtern die Arbeit mit Containern und Arrays in der Art, dass Iteratoren beim Traversieren von Objekten dieser Datentypen für viele Anwendungsfälle überflüssig werden:#include <iostream> #include <string> #include <vector> using namespace std ; void printNames ( const vector < string >& names ) { for ( const string & singleName : names ) cout << singleName << endl ; }
- Es dürfen direkt aufeinanderfolgende spitze Klammern bei Templates benutzt werden:
map<int, vector<int >>
. - Überdies erfolgte mit der Einführung von „variadic templates“ eine großräumige Erweiterung der Nutzungsmöglichkeiten von Templates. Diese ermöglichen nun eine nicht fixe Anzahl von Template-Argumenten
template<typename... Values> class VariadicExampleClass;
, was weitreichende Optionen und Vereinfachungen im Code- bzw. Algorithmenaufbau und der Codestruktur allgemein ermöglicht. Des Weiteren haben sie, wie viele andere C++11 -Erweiterungen auch, das Potential, die Notwendigkeit zur Nutzung von teils fehleranfälligen und nicht robusten Macros weiter einzuschränken. - Die explizite Nutzbarkeit sogenannter Rvalue-Referenzen ermöglicht, aufbauend unter anderem auf sogenannter Bewegungssemantik, ein breites Spektrum von Codevereinfachungen, Laufzeitoptimierungen und ausnahmesicherer Programmierung. Mit den Rvalue-Referenzen wurden auch die sogenannten universellen Referenzen eingeführt, welche das Problem des „Perfect forwarding“ auf Sprachebene robust und einfach lösbar machen (die konsistente Weiterreichung von Typen innerhalb von Templatekonstrukten, die per „type deduction“ aufgelöst wurden, an weiterführende Templates). Vor der Verabschiedung des C++11 -Standards war dies zumindest rein auf Sprachebene nicht möglich und erforderte vom Programmierer je nach Problemfall mehr oder weniger viel Eigenregie mit teils entsprechender Codeaufblähung und -Duplizierung.
- Außerdem wurden einige Features aus C11 übernommen, zum Beispiel Ganzzahlen mit mindestens 64 Bit (
long long
) oder Zusicherungen zur Übersetzungszeit mittelsstatic_assert
(in C11:_Static_assert
). [32]
Themen der Sprache C++, die Rechenzeit und Speicherplatz betreffen, wurden im sogenannten technical report ISO/IEC TR 18015:2006 behandelt. [33]
Zum Zeitpunkt der Einführung des Standards und auch noch vergleichsweise lange darüber hinaus unterstützten viele gängige Compiler diesen nicht vollständig bzw. mit Bezug auf einige Erweiterungen mitunter fehlerhaft. Besonders starke Einschränkungen zeigte diesbezüglich zum Beispiel Microsoft mit Visual C++ 2012 . Mit Visual C++ 2015 sind mittlerweile jedoch nahezu alle wichtigen größeren Spracherweiterungen berücksichtigt worden. [34] [35]
C++14
C++14, beschrieben im Standard ISO/IEC 14882:2014, [2] erweitert die Einsatzmöglichkeiten von auto
und decltype
, schwächt die Voraussetzungen für constexpr
ab, erlaubt Variablen-Templates zu definieren (beispielsweise um mehrere Versionen von π mit je nach Typ unterschiedlicher Genauigkeit zu definieren), führt Binärliterale ein (0b...), führt Hochkommata als Trennzeichen in Zahlen ein, erlaubt generische Lambdas, erweitert Lambda capture expressions und führt das Attribut deprecated
ein. [2]
Außerdem wurde die Standardbibliothek um ein paar Funktionen ergänzt, die bei C++11 „vergessen“ bzw. „übersehen“ wurden (z. B. std::make_unique
) und etliche Funktionsdeklarationen nun als constexpr
umdeklariert, was dem Compiler aggressivere Optimierungen gestattet.
Während der Entwicklungsphase wurde C++14 auch C++1y genannt, um anzudeuten, dass es die Nachfolgeversion der vormals als C++0x genannten Version sein wird.
C++17
Im März 2017 hat das ISO-C++-Komitee den Sprachstandard C++17 technisch abgeschlossen. Für die neue Fassung wurde unter anderem die Aufnahme des Typen std::byte
beschlossen. [36] Dieser ist explizit für den byte-weisen Zugriff auf den Speicher bestimmt. Es wurden neue, generische Container eingeführt: std::any
als Alternative zu void*
mit Typeüberprüfung zur Laufzeit, std::variant
als Alternative zur aus C übernommenen Union mit Laufzeit-Typprüfung und std::optional
, ein Container, der genau ein Element enthalten kann, aber nicht muss.
Bis zur offiziellen Verabschiedung wurde die Fassung auch als C++1z bezeichnet. [37]
Nach dem Sommer-Meeting Mitte Juli verriet der C++-Experte Herb Sutter , der für die Einberufung des Komitees verantwortlich ist, in seinem Blog [38] bereits erste Pläne für C++20.
C++20
Eine beträchtliche Anzahl an Features, die wahrscheinlich mit C++20 kommen wird, steht schon fest.
- Concepts
- bestimmte Initialisierer (zuerst in C99 )
- [=, this] in Lambdas
- Template-Parameter-Listen in Parametern
- Koroutinen
- ein Modulsystem zur Codekapselung und kürzeren Kompilierzeiten [39]
- Transaktionaler Speicher
- std::format als moderner Ersatz für sprintf und stringstreams
- std::span Erweiterung des Konzeptes von string_view (C++17) auf beliebige Felder
C++23/26 [40]
- Reflection
- Executors
- Pattern Matching
- Networking
Der Name „C++“
Der Name C++ ist eine Wortschöpfung von Rick Mascitti, einem Mitarbeiter Stroustrups, und wurde zum ersten Mal im Dezember 1983 benutzt. Der Name kommt von der Verbindung der Vorgängersprache C und dem Inkrement -Operator „++“, der den Wert einer Variablen inkrementiert (um eins erhöht). Der Erfinder von C++, Bjarne Stroustrup, nannte C++ zunächst „C mit Klassen“ ( C with classes ). [41]
Kritik
Oft geäußerte Kritik an der Sprache umfasst beispielsweise:
- C++ sei sehr komplex und fehleranfällig zu programmieren. Man müsse viel lernen und üben, um es gut zu beherrschen, und viele Features gelten als äußerst komplex. [42]
- C++ sei zu low-level -mäßig aufgebaut; während es viele Features von höher abstrahierenden Sprachen aufweist (Klassen, generische Klassen/Funktionen etc.), seien als wichtig empfundene Dinge, insbesondere Garbage Collection , nicht vorhanden.[6]
- C++ gilt zwar als schnell, beispielsweise wegen der Möglichkeit, frei mit Pointern zu arbeiten, doch diese Leistung sei auf den heutigen, schnellen Computersystemen nur in Ausnahmefällen nötig: Während es sinnvoll sei, Betriebssysteme o. Ä. in C++ zu schreiben, sei es softwaretechnisch viel günstiger, Anwendungsprogramme in höheren Sprachen zu schreiben, da diese leichter zu warten seien und immer noch eine ausreichende Leistung aufwiesen. [43]
- Typisch in Verbindung mit C++ ist das Zitat von Bjarne Stroustrup:
“In C++ it's harder to shoot yourself in the foot, but when you do, you blow off your whole leg.”
„In C++ ist es schwieriger, sich selbst in den Fuß zu schießen, aber wenn man es tut, dann ist gleich das ganze Bein weg.“ [44]
- Soll heißen: C++ erleichtert zunächst vieles, aber es bringt gleichzeitig viele Mittel mit sich, die mit Bedacht eingesetzt werden müssen. Zum Beispiel können durch die dynamische Speicherallokation ohne automatische Speicherfreigabe Speicherlecks entstehen. Zeiger können auf falsche Speicherbereiche verweisen und verstecktes Fehlverhalten erzeugen ( Hängender Zeiger ).
Siehe auch
- C++/CLI
- Embedded C++ , ein Dialekt von C++, bei dem einige Sprachfeatures und Bibliotheksfunktionen entfernt wurden, um für eingebettete Systeme geeigneter zu sein.
- Argument dependent name lookup
Literatur
- Bjarne Stroustrup : Die C++-Programmiersprache: Aktuell zu C++11 . Carl Hanser, 2015, ISBN 978-3-446-43961-0 (Standardwerk zu C++, Grundkenntnisse in C von Vorteil).
- Bjarne Stroustrup: The Design and Evolution of C++ . Addison-Wesley, 1994, ISBN 0-201-54330-3 (Buch beschreibt die Entwicklung und das Design von C++; vom Sprachdesigner geschrieben).
- Bjarne Stroustrup: Programming – Principles and Practice Using C++ . Addison-Wesley, 2008, ISBN 978-0-321-54372-1 (Einführung in die Programmierung; Standardwerk für Einstiegsprogrammierkurse an der Universität Texas A&M).
- Herb Sutter : Exceptional C++ . 1. Auflage. Addison-Wesley, 2000, ISBN 3-8273-1711-8 (Vertiefung vorhandener C++-Kenntnisse.).
- Andrei Alexandrescu : Modernes C++ Design – Generische Programmierung und Entwurfsmuster angewendet . 1. Auflage. Mitp-Verlag, 2003, ISBN 3-8266-1347-3 (Ein Standardwerk zur C++-Metaprogrammierung , setzt ein tiefes Verständnis von C++ voraus.).
- Ulrich Breymann : C++ lernen – professionell anwenden – Lösungen nutzen . 4. überarbeitete Auflage. Addison-Wesley, 2015, ISBN 978-3-446-44346-4 (C++-Einführung aus dem Hochschulumfeld).
- Sibylle Schupp : A Semantic Definition of Separate Type Checking in C++ with Concepts . (wissenschaftlicher Artikel). In: Journal of Object Technology . Band 8 , Nr. 5 , 2009, S. 105–132 , doi : 10.5381/jot.2009.8.5.a2 .
Weblinks
- Webauftritt des C++-Standardisierungskomitees (englisch)
- Working Draft, Standard for Programming Language C++ (englisch, PDF, 5,1 MB)
- Standard C++ Foundation (englisch)
- Website von Bjarne Stroustrup mit dessen FAQs und starkem C++-Fokus (englisch)
- C++ Reference ; Wiki zu C++ (primär englisch)
- C++ Annotations , umfangreiche Einführung von Frank B. Brokken (englisch)
Einzelnachweise
- ↑ Herb Sutter: Trip report: Summer ISO C++ standards meeting (Oulu). In: Sutter's Mill. 30. Juni 2016, abgerufen am 4. April 2020 (englisch).
- ↑ a b c ISO/IEC 14882:2014 – Information technology -- Programming languages -- C++. In: www.iso.org. Dezember 2014, abgerufen am 22. September 2018 .
- ↑ ISO/IEC 14882:2017 – Programming languages -- C++. In: www.iso.org. Dezember 2017, abgerufen am 22. September 2018 .
- ↑ 9. Classes — Python 3.6.4 documentation. In: docs.python.org. Abgerufen am 17. Mai 2018 .
- ↑ The Programming Languages Beacon. In: lextrait.com. Abgerufen am 21. Januar 2018 (englisch).
- ↑ a b Bjarne Stroustrup: Proposal to Acknowledge that Garbage Collection for C++ is Possible. (PDF) 1996, abgerufen am 6. Juni 2015 (englisch): „The most loudly proclaimed fundamental weakness of C++ these days is the absence of automatic garbage collection. This criticism is harming C++'s reputation, scaring potential users away, and restricting the range of applications for which C++ is a strong contender as an implementation language. For many applications automatic garbage collection is indeed a very powerful tool and the right tool for the job.“
- ↑ Hans-J. Boehm, Mike Spertus, Clark Nelson: N2670: Minimal Support for Garbage Collection and Reachability-Based Leak Detection (revised). In: open-std.org. 13. Juni 2008, abgerufen am 21. Januar 2018 (englisch).
- ↑ Transparent Programmer-Directed Garbage Collection for C++ (PDF).
- ↑ Bjarne Stroustrup: C++-FAQ über Speicherlecks (englisch); abgerufen am 3. Mai 2013.
- ↑ std::shared_ptr auf cppreference.com , Abschnitt Hinweise zur Umsetzung; abgerufen am 5. Juni 2020
- ↑ Das d-Zeiger-Idiom. auf heise Developer.
- ↑ Undefiniertes Verhalten bei mehrfacher Zuweisung. ( Memento vom 22. August 2014 im Internet Archive ), abgerufen am 20. August 2014.
- ↑ Scott Meyers: Effektiv C++ Programmieren. Addison-Wesley, S. 22/23, 43/44 und 46, nach Google-Books , abgerufen am 20. August 2014.
- ↑ Myths and Missconceptions about C++, Abschnitt Undefined Behavior , abgerufen am 20. Februar 2015 (englisch).
- ↑ Bjarne Stroustrup's C++ Style and Technique FAQ. In: www.stroustrup.com. 30. September 2017, abgerufen am 22. September 2018 (englisch).
- ↑ Bjarne Stroustrup: Evolving a language in and for the real world: C++ 1991–2006. (PDF; 690 kB).
- ↑ Clang: a C language family frontend for LLVM. In: clang.llvm.org. Abgerufen am 22. September 2018 (englisch).
- ↑ Oracle Developer Studio. In: www.oracle.com. Abgerufen am 22. September 2018 (englisch).
- ↑ Turbo C++ Community. In: www.turboexplorer.com. Abgerufen am 22. September 2018 (englisch).
- ↑ Java – A Bit of History oder Peter Drayton, Ted Neward, Ben Albahari: C# in a Nutshell: A Desktop Quick Reference . 2. Auflage. O'Reilly, 2003, ISBN 978-0-596-00526-9 .
- ↑ C++11 einstimmig als Standard angenommen. auf Heise online , 13. August 2011.
- ↑ Neue C++-Version als ISO/IEC-Standard veröffentlicht. Heise online, 11. Oktober 2011.
- ↑ Programmiersprache: ISO veröffentlicht C++11. Golem.de , 11. Oktober 2011.
- ↑ C++11 – the new ISO C++ standard. In: www.stroustrup.com. Abgerufen am 22. September 2018 (englisch).
- ↑ A Proposal to add Regular Expressions to the Standard Library. bei Open Standards. 3. März 2003 (englisch).
- ↑ A Proposal to Add General Purpose Smart Pointers to the Library Technical Report . bei Open Standards. 27. März 2003 (englisch)
- ↑ A Proposal to Add Hash Tables to the Standard Library. bei Open Standards. 9. April 2003 (englisch).
- ↑ A Proposal to Add an Extensible Random Number Facility to the Standard Library. bei Open Standards. 10. April 2003 (englisch).
- ↑ Proposal for adding tuple types into the standard library. (PDF; 164 kB) bei Open Standards. 8. November 2002 (englisch).
- ↑ A Proposal to Add Mathematical Special Functions to the C++ Standard Library. bei Open Standards. 24. Februar 2003 (englisch).
- ↑ ISO/IEC JTC1/SC22/WG21 N1568. bei Open Standards , von 2004 (englisch).
- ↑ B. Stroustrup: C++11 FAQ
- ↑ ISO Technical Report on C++ Performance (PDF; 1,2 MB)
- ↑ MSDN: Unterstützung für C++11/14/17-Funktionen (Modern C++) Unterstützung von C++11/14/17-Features durch Microsoft-Compiler
- ↑ The GNU Compiler Collection: Status of Experimental C++11 Support in GCC 4.7 Unterstützung von C++11-Features durch den gcc
- ↑ Programmiersprachen: C++17 ist technisch fertig. heise.de, abgerufen am 17. Juli 2017 .
- ↑ C++ Support in Clang. C++17 implementation status. In: clang.llvm.org. 22. September 2018, abgerufen am 22. September 2018 (englisch).
- ↑ Trip report: Summer ISO C++ standards meeting (Toronto). herbsutter.com, abgerufen am 17. Juli 2017 (englisch).
- ↑ C++ Modules Might Be Dead-on-Arrival. In: vector-of-bool.github.io. Abgerufen am 21. Mai 2019 (englisch).
- ↑ r/cpp – 2019-02 Kona ISO C++ Committee Trip Report (C++20 design is complete; Modules in C++20; Coroutines in C++20; Reflection TS v1 published; work begins on a C++ Ecosystem Technical Report). Abgerufen am 22. August 2019 (englisch).
- ↑ When was C++ invented? (englisch) – FAQ-Eintrag bei AT&T Labs Research ; Stand: 4. Juli 2011.
- ↑ Ian Joyner: C++?? A Critique of C++. (PDF) November 1992, S. 27–29 , abgerufen am 6. Juni 2015 (englisch).
- ↑ The Problem With C++. In: www.codinghorror.com. 12. Januar 2007, abgerufen am 22. September 2018 (englisch).
- ↑ Bjarne Stroustrup's FAQ. Did you really say that? In: www.stroustrup.com. 18. März 2018, abgerufen am 22. September 2018 (englisch).