C ++
C ++ | |
---|---|
![]() | |
Grunngögn | |
Fyrirmyndir : | Margfeldi ( almennt , mikilvægt , hlutbundið , málsmeðferð , uppbyggt , hagnýtt ) |
Útgáfuár: | 1985 |
Hönnuður: | Bjarne Stroustrup |
Hönnuður: | Bjarne Stroustrup |
Núverandi útgáfa : | C ++ 17 (1. desember 2017) |
Núverandi frumútgáfa: | C ++ 20 [1] () |
Vélritun : | truflanir (dýnamísk gerðarprófun möguleg) , óbein, sterk |
Mikilvægar útfærslur : | C ++ Builder , GCC , MS Visual C ++ , Intel C ++ Compiler , Clang / LLVM |
Stöðlun: | 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] |
Undir áhrifum frá: | C , Simula , Ada , ALGOL 68 , CLU , ML |
Áhrif: | Ada 95 , Chapel , C # , D , Go , Java , Nim , Perl , PHP , Python [4] , Vala , Rust , Seed7 |
isocpp.org |
C ++ er forritunarmál staðlað með ISO . Það var þróað frá 1979 af Bjarne Stroustrup hjá AT&T sem framlenging á forritunarmálinu C. C ++ gerir skilvirka og vélamiðaða forritun sem og forritun á miklu abstrakti. Staðallinn skilgreinir einnig staðlað bókasafn sem ýmsar útfærslur eru til fyrir.
Notkunarsvið
C ++ er notað bæði í kerfisforritun og í forritun og er eitt vinsælasta forritunarmál á báðum sviðum. [5]
Kerfisforritun
Dæmigert notkunarsvið í kerfisforritun eru stýrikerfi , innbyggð kerfi , sýndarvélar , ökumenn og merkivinnslur . C ++ tekur oft þann stað sem áður var frátekinn eingöngu fyrir samsetningar tungumál og C forritunarmálið.
Forritun forrita
Í forritunarforritum er C ++ aðallega notað þar sem miklar kröfur eru gerðar til skilvirkni til að nýta sem best árangurstakmarkanirnar sem tilgreindar eru með tæknilegum rammaaðstæðum. Frá árinu 2000 var C ++ ýtt aftur af léni forritunar með tungumálunum Java og C # .
eignir
Málhönnun
C ++ tungumálið notar aðeins um 60 lykilorð („tungumálakjarni“), sum eru notuð margoft í mismunandi samhengi ( static
, default
). Það fær raunverulega virkni sína, svipað og C tungumálið, frá C ++ staðlaða bókasafninu , sem veitir tungumálinu mikilvægar aðgerðir (fylki, vektorar, listar, ...) auk þess að koma á tengingu við stýrikerfið ( iostream, fopen, exit, ...). Fleiri bókasöfnum og ramma er bætt við eftir notkunarsviði. C ++ leggur áherslu á tungumálauðlindir til að þróa bókasöfn. Þess vegna styður það almennar aðferðir við dæmigerð vandamál og hefur varla einstakar lausnir samþættar tungumálinu.
Einn af styrkleikum C ++ er hæfileikinn til að sameina skilvirka, lága stigs forritun með öflugum málauðlindum sem draga saman einföld til flókin útfærsluupplýsingar og fela þau að stórum hluta á bak við abstrakt skipanarröð. Sniðmátskipulag kemur hér við sögu : tækni sem leyfir nánast ósveigjanlega samsetningu skilvirkni og abstrakt.
Sumar hönnunarákvarðanir eru hins vegar oft gagnrýndar:
Auðlindastjórnun
C ++ er ekki með sorphirðu en reynt er að gera sorphirðu í gegnum bókasöfn eða með því að setja hana inn í tungumálastaðalinn.[6] [7] [8] Sjá einnig Boehm sorphirðu .
Hins vegar er hægt að stjórna minni í forritinu; það er nauðsynlegt að innleiða lágmarks stig bókasöfn eins og C ++ staðlaða bókasafnið. Hins vegar er þetta mjög slæmt í kóða á háu stigi. [9]
Þess í stað er venja þar að láta C ++ staðlaða bókasafnið yfirtaka minnisstjórnun með því að nota ílátaflokkana sem í boði eru. Önnur úrræði, s.s. B. Skrá handföng eða net fals eru yfirleitt stjórnað í C ++ í aðskildum flokkum með RAII meginreglu í því skyni að tryggja sjálfvirka þrífa eftir notkun.
Ef þú vísar sjálfur til annarra hluta í hlutum, þá vinnurðu venjulega með snjallar vísbendingar sem valkostur við sorphirðu, sem síðan tekur við auðlindastjórnuninni. Innanhúss notar staðlaða bókasafnið aðallega tilvísunartölu . [10]
Ófullkomin hlutlæg stefna
Sýnileiki einkaþátta
Í C ++ eru einkaeignir (breytur og aðferðir) venjulega hluti af viðmótinu, sem er birt í hausskránni. Þetta skapar ósjálfstæði milli hlutanna og staðsetninganna sem þeir nota á samantektartíma og keyrslutíma .
Hægt er að koma í veg fyrir þessar ósjálfstæði með því að nota ákveðnar mannvirki, svo sem pimpl idiom ( bendir til framkvæmdarmála ). Einka svið bekkjarins ( dæmi_klassi ) eru færð yfir í einkaaðila, framlýst hjálparflokk og vísir að hlut úr þessum hjálparflokki ( dæmi_flokkur :: impl * impl_ptr ) er áfram í raunverulegum flokki. Skilgreiningin á framkvæmdaflokknum á sér stað þegar almenningsstéttin er innleidd og er því ósýnileg notanda bekkjarins (sem þekkir aðeins hausskrána). Vegna þess að tilvísunarklúbburinn vísar aðeins til með bendi, allar breytingar á frumkóða á einkasvæðum eru áfram gagnsæjar og tvöfaldur eindrægni er viðhaldið. [11]
Ófullnægjandi umbúðir
Í C ++ eru minnissvæði einstakra hluta ekki varin gegn (viljandi eða óviljandi) gagnkvæmum breytingum við keyrslutíma.
Óskilgreind hegðun
Hegðun sumra málgerða er ekki skilgreind. Þetta þýðir að staðallinn hvorki ræður né mælir með því sem gerist í slíku tilviki. Áhrifin eru allt frá því að vera háð framkvæmd (þ.e. smíðin getur hegðað sér misjafnt eftir miðatölvunni og þýðandanum) til vitlausra niðurstaðna eða hrun forrita í öryggisbil. Sum þessara frelsis þýðanda leyfa viðbótar hagræðingu kóðans.
Það er mismunandi hegðun
- mismunandi þýðendur
- mismunandi útgáfur útgáfu
- mismunandi arkitektúr ( ARM , x86 , x64 )
- ýmsar hagræðingarstillingar (kembiforrit, losun, hagræðing)
- Valið fræðasett , boðstefnur og margt fleira
Upprunakóði með kóða með óskilgreindum hegðun getur sýnt óvænta og fáránlega hegðun eftir samantekt. Athuganir sem eru gerðar of seint eru fínstilltar í burtu eða lykkjum sem fá aðgang að ógildri vísitölu fylki er skipt út fyrir tómar endalausar lykkjur. [12] [13]
Til að skilja óskilgreinda hegðun er sérstaklega mikilvægt að ein aðgerð sé aldrei ógild, heldur að allt forritið verður ógilt og táknar ekki lengur vel mótað C ++. Ástæðan er sú að sumar tegundir „óskilgreindrar hegðunar“ hafa áhrif á gjörólíka hluti forritsins, þar með talið þá sem eru réttir í sjálfu sér, og geta haft áhrif á hegðun þeirra, til dæmis ef flæði biðminni eða óviljandi breyting á örgjörvafánum stafar af ógildri reikniaðgerð og getur haft áhrif á eftirfarandi útreikninga.
Dæmi um óskilgreinda hegðun :
- Yfirflæði undirritaðra heiltala (einnig t.d. við umbreytingu
unsigned int
íint
) - Null bendir tilvísun
- Array aðgangur með ógildri vísitölu
- Vaktaraðgerðir með vaktbreidd sem er neikvæð eða meiri en eða jöfn fjölda bita af þeirri gerð sem á að færa
- Deiling með núlli með óaðskiljanlegum gagnategundum
- Athafnaleysi
return
yfirlýsingu í aðgerðum með skilagildi (helsta virkamain
er eina undantekningin) - Aukaverkun breytir breytu sem kemur nokkrum sinnum fyrir í tjáningunni (
v[i] = i++;
) eða í röksemdalistanum (f(i, i++);
) (matsröð hlutatjáninga og aðgerða rök eru ekki fast)
Annars vegar er að minnsta kosti að flokkast sem áhætta, en í reynd er það augljós ókostur. Á hinn bóginn gerir þetta hraðari forrit möguleg, þar sem hægt er að sleppa gildisathugunum og þýðandinn getur líka oft fínstillt forritahluta í meira mæli með því að hunsa brúnatilfelli sem eru útilokuð samkvæmt skilgreiningu.
Annar kostur, sem oft er ekki skynjaður, er að óskilgreind hegðun kemur nánast aðeins fram í afar vafasömum uppbyggingum, sem þó er ekki endilega hægt að ganga úr skugga um við samantekt, bannar í raun ómerkilega kóða eða á annan hátt.
Til dæmis er ólögleg leið til að athuga hvort summa tveggja jákvæðra heiltala sé og af gerðinni 'int' er hægt að kortleggja aftur í 'int' án taps, með því að skoða hvort summa þeirra er meiri en 0 (ef um flæði er að ræða, þá getur viðbótarreikningur tveggja í flestum tölvum haft neikvæða tölu). Slík athugun er ekki sérstaklega gagnleg frá stærðfræðilegu sjónarmiði. Betri (merkingarlegri) nálgun hér er raunveruleg spurning um hvort , þar sem stærsta tala sem hægt er að tákna í 'int' er, eftir stærðfræðilega gilda breytingu á að nota. [14]
Samhæfni við C
Til að tengjast útbreiðslu C forritunarmálsins var C ++ hannað sem framlenging á C í samræmi við stöðu 1990 ( ISO / IEC 9899: 1990 , einnig kallað C90 í stuttu máli).
Samhæfni við C neyðir C ++ til að halda áfram með nokkra af þeim göllum sem það hefur erft. Þetta felur í sér stundum erfitt að skilja C setningafræði, forvinnsluforritið , sem er talið úrelt, og ýmsar upplýsingar um tungumálið eftir viðkomandi palli, sem gera flutning C ++ forrita milli mismunandi tölvutegunda, stýrikerfa og þýðenda erfiða.
Sumar C málgerðir hafa svolítið aðra merkingu eða setningafræði í C ++, þannig að fyrst þarf að laga sum C forrit til að hægt sé að setja þau saman sem C ++ forrit. Frekari breytingar á C áttu sér stað árið 1999 ( ISO / IEC 9899: 1999 , aka C99) og 2011 ( ISO / IEC 9899: 2011 , aka C11), þ.e. eftir fyrstu stöðlun C ++, þannig að breytingar sem þar eru felldar eru ekki í C ++ 98 gæti komið til greina. Sumir af nýju eiginleikum C99 voru teknir upp í endurskoðun C ++ 2011; á hinn bóginn hefur nýjum eiginleikum verið bætt við C staðalinn sem eru ekki samhæfðir við C ++ 11 heldur.
Tungumál lögun í smáatriðum
C ++ er byggt á C forritunarmálinu eins og lýst er í ISO / IEC 9899: 1990. Til viðbótar við valkostina sem eru tiltækir í C, býður C ++ upp á frekari gagnategundir sem og nýja gerð breytimöguleika, flokka með mörgum erfðum og sýndaraðgerðum , meðhöndlun undantekninga , sniðmát , nafnrými , línuaðgerðir , ofhleðslu rekstraraðila og aðgerðaheiti, tilvísanir , rekstraraðilar til að stjórna kraftmiklu minni og útbreiddu bókasafni með C ++ staðlaða bókasafninu .
Dæmi um forrit
Eftirfarandi frumkóði er einfalt C ++ forrit sem skrifar textann „Halló heimur!“ Við venjulega úttaksstrauminn , venjulega flugstöðina :
#include <iostream>
int main () {
std :: cout << "Halló heimur!" << std :: endl ;
skila 0 ;
}
Forvinnsla stjórn eða forvinnslutilskipun sem kallast #include
inniheldur hausskrár sem venjulega innihalda yfirlýsingar um breytur, gerðir og aðgerðir. Öfugt við C, hausar C ++ staðlaða bókasafnsins eru ekki með skráarviðbót.
Hausinn <iostream>
er hluti af C ++ staðlaða bókasafninu og lýsir meðal annars yfir staðlaða std::cerr
std::cin
og staðlaða std::cerr
std::cout
og std::cerr
fyrir hlutina stdin
, stdout
og stderr
þekktur frá C staðlaða bókasafninu.
main()
er fallið sem er inngangur allra C ++ forrita. Forritið er keyrt með því að hringja í main()
, sem aftur getur kallað á aðrar aðgerðir. Hins vegar má ekki kalla main()
sjálft endurtekið í C ++ forriti.
Staðallinn krefst þess að útfærslur styðji tvær undirskriftir fyrir main()
aðgerðina: eina án fallbreytur eins og í dæminu og eina sem tekur við heiltölu og bendi til bendils til að char
til að geta fengið aðgang að stjórnlínu breytum (sem er ekki mögulegt í öllum forritum sem krafist er): int main(int argc, char **argv)
. Framkvæmdir geta einnig stutt frekari undirskriftir fyrir main()
, en allar verða að hafa int
( heiltala ), það er að segja skila heiltölu. Ef main()
skilaði ekki gildi, þá krefst C ++ staðallinn að framkvæmdin return 0;
að samþykkja. main()
skilar 0 ef það er enginn annar return
yfirlýsingu í það. [15]
std::cout
er dæmi um std::basic_ostream<char>
, sem, líkt og allt C ++ staðlaða bókasafnið, er staðsett í std
nafnrýminu . Auðkenni í nafnrýmum er beint til sviðsrekstraraðila ( ::
:).
Rekstraraðilinn <<
tekur við framleiðsla stafstrengsins bókstaflega "Hallo Welt"
. Í C ++ eru bókstafir stafstrengja af gerðinni gerð sem samanstendur af N föstum bleikjum ( char const[N]
), þar sem N er jafnt lengd stafstrengsins +1 fyrir endanlega núlluppsögn . Þar sem staðlaðar gerðir af C ++ kveða á um óbeina breytingu fylki T[N]
í bendi T*
, þekkt sem rotnun músa í fylki , og þannig að char const[N]
sundurliðaður í char const*
, template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *);
símafyrirtækisins template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *);
passar við template<class traits> basic_ostream<char,traits>& operator<<(std::basic_ostream<char,traits>&, char const *);
frá <ostream>
og er kölluð í samræmi við það ( operator<<( std::cout, "Hallo Welt!" );
) og gefur út stafstrenginn. Output std::endl
staf .
Með return 0
er hringingarforritinu tilkynnt í gegnum stýrikerfið að framkvæmd forritsins hafi tekist.
Skrá eftirnafn
Dæmigert skráarsnið eru .C, .cc, .cpp, .cxx, .c ++ , .h, .hh, .hpp, .hxx, .h ++ , .ipp, .tpp.
framkvæmd
C ++ þýðandi
Talið er að flutningur C ++ þýðanda sé flókinn. Eftir að málstaðlinum var lokið árið 1998 tók það nokkur ár þar til tungumálið var að miklu leyti stutt af C ++ þýðendum.
Vinsælustu C ++ þýðendur eru:
- Visual C ++
- Þýðandinn sem er innifalinn í Microsoft Visual C ++ er mest notaður fyrir Windows stýrikerfið. Microsoft veitir samfélagsútgáfuna að kostnaðarlausu.
- GCC
- G ++ er C ++ útgáfan af GNU Compiler Collection (GCC); g ++ er opinn hugbúnaður og ókeypis aðgengilegur. G ++ styður margs konar stýrikerfi (þar á meðal Unix , Linux , macOS , Windows og AmigaOS ) og örgjörvapalla. GNU C ++ hefur verið til síðan 1987 og er þar með einn elsti C ++ þýðandinn. [16]
- Intel C ++ þýðandi
- Intel C ++ þýðandinn notar einnig nefnda C ++ framhlið frá EDG. Intel C ++ þýðandinn býr til vélakóða fyrir Intel örgjörvana undir Windows, Linux og macOS stýrikerfum. Þar sem forritin sem eru búin til með Intel C ++ þýðandanum nýta kenningarsett Intel örgjörvanna sérstaklega vel, búa þau til sérstaklega skilvirkt forrit fyrir þennan vettvang. (Samsetningar Intel þýðandans keyra venjulega líka hraðar á AMD flögum en samantektir á öðrum þýðendum, en Intel læsir samsvarandi hagræðingarmerkjum, þannig að hægt er að hætta við læsinguna.) Intel C ++ þýðandinn notar nauðsynlega hluta g ++ í undirbyggingunni og skiptir út og framlengir hluta af hagræðingu kóða og kóðaöflun.
- Klangur
- Clang , framhlið fyrir þverpallara þýðanda innviði LLVM kynnt af Apple, sem meðal annars er einnig notað í samþætta þróunarumhverfi Xcode . [17]
- Oracle Solaris stúdíó
- Oracle Solaris Studio ( Wikipedia færsla ) er fáanlegt ókeypis hjá Oracle. [18]
- Comeau C ++
- Comeau C ++ . Svokölluð „framendi“ þýðandans, það er sá hluti sem útfærir greiningarfasann, var þróaður af Edison Design Group (EDG), sem sérhæfir sig í þróun framanenda á þýðanda og C ++ þeirra-framhlið er einnig innbyggt í marga aðra auglýsing C ++ þýðendur. Einnig er hægt að prófa Comeau þýðandann á netinu.
- Turbo C ++
- Annar þýðandi er fáanlegur með Turbo C ++ / C ++ Builder . [19]
Innbyggt þróunarumhverfi
Ókeypis þróunarumhverfi
- Anyuta
- Arduino
- CodeLite
- Kóði :: blokkir
- Myrkvi
- Geany
- GNAT forritunar stúdíó
- KDevelop
- MonoDevelop
- NetBeans IDE
- Orwell Dev-C ++
- Qt Creator
- ÁKVÆÐI
- Ultimate ++
- WideStudio
Sér þróað umhverfi
- C ++ smiður
- CLion (byggt á IntelliJ IDEA )
- CodeWarrior
- Hugmynd 16 (forritunarmál svipað og C ++)
- Kubísk IDE
- ICON-L
- Kylix
- Visual stúdíó
- Xcode
Samanburður við önnur tungumál
Markmið-C
C ++ var ekki eina aðferðin til að bæta aðgerðum við C forritunarmálið sem einfalda hlutbundna forritun. Á níunda áratugnum var forritunarmálið Objective-C búið til , sem, öfugt við C ++, var byggt á Smalltalk en ekki Simula bæði hvað varðar setningafræði og hagnýt meginreglu. Setningafræði Objective-C (C undir áhrifum Smalltalk) er töluvert frábrugðin C ++ (C undir áhrifum frá Simula með eigin setningafræðilegu viðbætur). Seint á níunda áratugnum var Objective-C fyrst notað í viðskiptalegum tilgangi í NeXTStep , þar sem það er miðlægur þáttur. Nú á dögum er það notað í forritunartengi OpenStep (eða Cocoa og GNUstep ) sem og í stýrikerfum iOS og macOS .
Java og C #
Forritunarmálin Java og C # hafa svipaða setningafræði, einnig byggð á C, þar sem C ++, [20] eru einnig hlutbundin og hafa stutt gerðar breytur í nokkurn tíma. Þrátt fyrir ytri líkt eru þeir í sumum tilfellum verulega frábrugðnir hugmyndafræðilega frá C ++.
Almennar aðferðir bæta hlutbundna forritun með gerðar breytum og auka þannig endurnýtanleika reiknirita sem hafa verið kóðuð einu sinni. Hins vegar eiga almennu Java eftirnafn aðeins við um flokka, ekki frumstæðar gerðir eða gagna fasta. Aftur á móti innihalda almennar tungumálaviðbætur C # einnig frumstæðar gerðir. Hins vegar er þetta viðbót fyrir samheitalyf við keyrslutíma, sem getur gagnlega bætt við C ++ sniðmátin sem eru sniðin að samantektartíma, en getur ekki komið í stað þeirra.
Sérstaklega almenn forritun gerir C ++ að öflugu forritunartæki. Þó að hlutbundin forritun í Java og C # sé enn miðlægur abstraktunarháttur, þá er þessi forritun í C ++ á undanhaldi. Á þennan hátt er forðast djúpa stéttveldi og í hag hagræðingar og lágmarks auðlindanotkunar er margræðni , einn af grundvallarþáttum hlutbundinnar forritunar, í mörgum tilfellum sleppt.
Sköpun og frekari þróun
Upprunasaga
Stroustrup fékk hugmyndina að nýju forritunarmáli með reynslu af forritunarmálinu Simula í doktorsritgerð sinni við Cambridge háskóla . Simula virtist henta til notkunar í stórum hugbúnaðarverkefnum en uppbygging tungumálsins gerði það erfitt að búa til mjög skilvirkt forrit . Aftur á móti væri hægt að skrifa skilvirkt forrit með BCPL tungumálinu, en BCPL var aftur óhentugt fyrir stór verkefni.
Með reynslu af doktorsritgerð sinni stækkaði Stroustrup forritunarmálið C frá 1979 og áfram hjá AT&T Bell Laboratories sem hluta af rannsókn á Unix stýrikerfi kjarna með tilliti til dreifðrar tölvuvinnslu . C forritunarmálið var valið vegna þess að C var almennt tungumál sem framleiddi kóða fljótt og var auðvelt að flytja á aðra vettvang. Sem tungumálið sem fylgir Unix stýrikerfinu var C einnig mikið notað.
Ein af fyrstu viðbótunum var bekkjarhugtak með hylkingu gagna sem Simula-67 tungumálið var aðal fyrirmyndin fyrir. Þá voru unnin flokkum, strangari gerð kerfi , Inline virka og staðall rök.
Á meðan Stroustrup var að þróa C með Classes (sem síðar varð C ++), skrifaði hann einnig cfront , þýðanda sem upphaflega myndaði C kóða sem milliriðuniðurstöðu frá C með Classes . Fyrsta auglýsingaútgáfan af cfront birtist í október 1985.
Árið 1983 var C með flokkum endurnefnt C ++ . Viðbætur voru: ofhleðsla nafna og rekstraraðila, sýndaraðgerðir, tilvísanir, fastar, breytanleg hrúgustjórnun og endurbætt gerðarpróf. Möguleiki á athugasemdum sem eru bundnar við enda línu var yfirtekið af BCPL ( //
).
Árið 1985 birtist fyrsta útgáfan af C ++, sem var mikilvæg tilvísunarútgáfa vegna þess að tungumálið var ekki enn staðlað á þeim tíma. Árið 1989 birtist útgáfa 2.0 af C ++. Nýtt í því voru margföld arfleifð , abstrakt flokkar, truflanir meðlimaraðgerðir, stöðugir meðlimir og framlenging aðgangslíkansins með protected
. Árið 1990 kom út bókin The Annotated C ++ Reference Manual , sem var grundvöllur síðari stöðlunarferlisins.
Sniðmátum , meðhöndlun undantekninga , nafnrýmum , nýrri gerð viðskipta og Boolean gerðum var tiltölulega seint bætt við tungumálið.
Við frekari þróun C ++ tungumálsins var einnig búið til staðlað bókasafn sem var stækkað miðað við C. Fyrsta viðbótin var Stream I / O bókasafnið , sem kemur í stað hefðbundinna C aðgerða eins og printf()
og scanf()
. Ein helsta endurbótin á staðlaða bókasafninu kom síðar með samþættingu stórra hluta Standard Template Library ( STL ) þróað af Hewlett-Packard .
stöðlun
Eftir margra ára vinnu var lokaútgáfa af C ++ tungumálinu (ISO / IEC 14882: 1998) loksins staðlað árið 1998. Eftir á að hyggja, þegar aðrar útgáfur af tungumálinu birtust, var þessi útgáfa einnig kölluð C ++ 98 . Árið 2003 var ISO / IEC 14882: 2003 samþykkt, breyting á staðlinum frá 1998 sem útrýmdi nokkrum misskilningi og skýrir ýmis atriði. Þessi útgáfa er einnig þekkt undir nafninu C ++ 03 .
Frekari þróun forritunarmálsins C ++ eftir 2005
Til að halda í við núverandi þróun í tölvutækni sem er að breytast hratt, en einnig til að leiðrétta þekkta veikleika, þróaði C ++ stöðlunarnefndin næstu stóra endurskoðun á C ++, sem var óopinberlega stytt í C ++ 0x , þar sem tölustafurinn var grófur. Ætti að gefa til kynna áætlun um mögulega útgáfudag. Síðar, þegar ekki var lengur hægt að geyma útgáfudag fyrr en í lok árs 2009, var óopinberu nafni breytt í C ++ 1x .
Aðalmarkmiðin fyrir frekari þróun C ++ voru úrbætur hvað varðar kerfisforritun og stofnun forritsbókasafna. Að auki ætti að bæta lærdómshæfni tungumálsins fyrir byrjendur.
Í nóvember 2006 var markmiðið að ljúka árinu 2009. Í júlí 2009 var þessari dagsetningu breytt í fyrsta lagi í 2010. Í ágúst 2011 var endurskoðunin samþykkt samhljóða með ISO [21] og opinberlega birt 11. október 2011 sem ISO / IEC 14882: 2011. [22] [23] Óopinberlega heitir útgáfan C ++ 11 .
Endurbætur á tungumálakjarnanum
C ++ 98 náði ekki enn nægilega til sumra dæmigerðra vandamálasviða í forritun, til dæmis stuðningur samtímis ( þræðir ), en samþætting þess í C ++, sérstaklega til notkunar í fjölvinnsluumhverfi, gerði endurskoðun á tungumálinu óhjákvæmilegt. Með tilkomu minnislíkans voru gerðar ábyrgðir á tungumálinu fyrir samhliða aðgerð til að bæði leysa tvímæli í vinnsluröðinni og viðhalda þeim í vissum tilfellum og skapa þannig svigrúm til hagræðingar.
Til breiðari máltenginga tilheyrði enn frekar, sjálfvirka tegundafleiðan fyrir afleiðingu niðurstaðna orðatiltækja og svokallaðar R-gildistilvísanir, getur síðan orðið að veruleika sem viðbót við núverandi afritunarhluti og færslu með hjálp þeirra, einnig sviðsbundnar for-lykkjur ( foreach ) um gáma og innbyggða reiti. [24]
Stækkun forritsbókasafns
Í apríl 2006 birti C ++ stöðlunarnefndin svokallaða fyrstu tækniskýrslu (TR1), sem er ekki staðlað viðbót við núverandi bókasafn sem var skilgreint árið 1998, en með henni skal skoða framlengingartillögur með tilliti til hagnýtingarhæfleika þeirra áður en þær er hægt að flytja í C ++ staðlaða bókasafnið . Margir þýðendaframleiðendur afhentu TR1 með vörur sínar.
TR1 innihélt regluleg orðasambönd , [25] ýmsar greindar vísbendingar , [26] óröðuð tengd ílát , [27] handahófsnúmerasafn, [28] verkfæri fyrir C ++ lýsingu, túplur [29] og töluleg og stærðfræðileg bókasöfn. [30] Flestar þessar endurbætur komu frá Boost bókasafninu sem þær voru teknar af með lágmarks breytingum. Að auki voru allar bókasafnsviðbætur forritunarmálsins C (C99), sem endurskoðaðar voru árið 1999, með í formi sem var aðlagað C ++. [31]
Að undanskildum tölulegum og stærðfræðilegum bókasöfnum hafa allar TR1 viðbætur verið felldar inn í C ++ 11 tungumálastaðalinn. Sérstakt bókasafn til að styðja við þræði hefur einnig verið kynnt.
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).