C++

C ++
programmeringsspråk
ForfatterBjarne Stroustrup
Opprinnelsesdato1983
Siste versjonC ++ 20 (desember 2020)
BrukGenerisk
ParadigmerMulti-paradigme, prosedyremessig , funksjonell , objektorientert
SkrivingStatisk
Vanlige utvidelser.h .hh .hpp .hxx .h ++ .cc .cpp .cxx .c ++
Påvirket avC , Objective-C , Simula , ALGOL , Ada , CLU , ML
Det påvirketJava , C # , Python , Rust , Perl , PHP
Referanseimplementering
Nettstedisocpp.org/

Innen datavitenskap er C++ et programmeringsspråk for generell bruk som opprinnelig ble utviklet av Bjarne Stroustrup i Bell Labs i 1983 som en videreutvikling av C-språket ved å sette inn objektorientert programmering ; over tid har det hatt betydelige evolusjoner, for eksempel introduksjonen av abstraksjon med hensyn til type.

Språket ble standardisert i 1998 ( ISO / IEC 14882 : 1998 "Information Technology - Programming Languages ​​- C ++", oppdatert i 2003 ). C ++ 11 , også kjent som C ++ 0x , er standarden som erstatter revisjonen fra 2003. Etter en mindre revisjon i 2014 ble en ny versjon av standarden (kjent som C ++ 17 ) utgitt i 2017. siste versjon av standarden ( C ++ 20 ) ble utgitt i 2020.

C++ er lillebroren til C og er fortsatt i dag et av de mest brukte programmeringsspråkene akkompagnert av C , C # , Python , Java og JavaScript .

Historie

Bjarne Stroustrup begynte å jobbe med språket i 1979 . Ideen om å skape et nytt språk oppsto i hans programmeringserfaringer under realiseringen av gradsoppgaven. Stroustrup fant ut at Simula hadde nyttige funksjoner for å utvikle store programvareprosjekter, men språket var for tregt til praktisk bruk, mens BCPL var raskt, men for lavt nivå for utvikling av store applikasjoner. Da Stroustrup begynte å jobbe i Bell Labs, fikk han i oppgave å analysere Unix -kjernen innen distribuert prosessering . Han husket arbeidet med oppgaven, og bestemte seg for å legge til noen av funksjonene til Simula til C-språket. C ble valgt fordi det var et raskt og bærbart allmennspråk. I tillegg til C og Simula ble han inspirert av språk som ALGOL 68 , Ada , CLU og ML-språket . Opprinnelig ble funksjonene til klasse , avledet klasse , streng typekontroll og standardargument lagt til C med Cfront . Den første kommersielle versjonen ble utgitt i oktober 1985 . [1]

I 1983 ble navnet på språket endret fra "C med klasser" til C ++. Nye funksjoner ble lagt til, inkludert virtuelle funksjoner , overbelastning av funksjoner og operatører, referanser , konstanter, brukerkontroll av minneadministrasjon, forbedret typekontroll og kommentarer i den nye stilen ("//"). I 1985 ble den første utgaven av The C ++ programmeringsspråk publisert , som ga en viktig referanseguide for språket, som ennå ikke var offisielt standardisert. I 1989 ble versjon 2.0 av C++ utgitt, hvor nye funksjoner inkluderer multippel arv , abstrakte klasser , statiske medlemsfunksjoner , const- medlemsfunksjoner og beskyttede medlemmer . I 1990 ble The Annotated C ++ Reference Manual publisert , som ga grunnlaget for den fremtidige standarden. De siste funksjonstilleggene inkluderer maler , unntak , navneområder , nye rollebesetningstyper og den boolske datatypen .

I likhet med språket har også standardbiblioteket utviklet seg. Det første tillegget til standard C++-biblioteket var I/O -strømbiblioteket som ga erstatningstjenester for det tradisjonelle C-biblioteket (som printf og scanf ). Senere, blant de viktigste tilleggene, var standardmalbiblioteket .

Etter mange års arbeid, standardiserte en komité med medlemmer fra ANSI og ISO C ++ i 1998 ( ISO / IEC 14882 : 1998 ). I noen år etter den offisielle utgivelsen av standardene fulgte komiteen utviklingen av språket og publiserte en korrigert versjon av standarden i 2003 .

En teknisk rapport dateres tilbake til 2005 , kalt "Technical Report 1" (forkortet TR1), som, selv om den ikke offisielt er en del av standarden, inneholder en rekke utvidelser til C ++ 11 standardbiblioteket .

Det er ingen eier av C++-språket, som kan implementeres uten å betale royalties. Selve standardiseringsdokumentet er imidlertid kun tilgjengelig mot et gebyr.

Genesis av navnet

Uttalen av C ++ er [ ˌsiː plʌs ˈplʌs] (på engelsk). Navnet ble foreslått av Rick Mascitti i midten av 1983 , da språket først ble brukt utenfor forskningssentre. Tidligere ble språket kalt "C med klasser". Navnet er et ordspill med en C-konstruksjon (der det doble plusstegnet er selvøkningsoperatoren, som øker verdien av en variabel med én) sammen med den vanlige konvensjonen om å legge til et plusstegn for å indikere en forbedret versjon. I følge Stroustrup: "++ er inkrementoperatoren til C [...] navnet uttrykker den evolusjonære naturen til endringer fra C" . Å bruke ordspillet unngår også problemet med at "C +" allerede har blitt brukt for et språk uten tilknytning til C ++ (for ikke å nevne at det ofte forbindes med lite mer enn nok evaluering i en akademisk ytelse).

Da han i 1992 ble spurt uformelt om navnet, forklarte Rick Mascitti at han hadde kommet med forslaget med en goliardisk ånd , og at han ikke trodde at det ville bli det formelle navnet på språket. Stroustrup foreslo også i etterkant en orwellsk tolkning av navnet, med henvisning til Newspeak "Dictionary C" - i romanen ordboken for faguttrykk, den eneste resten av et vitenskapelig språk - beskrevet i vedlegget fra 1984 og prefikset doubleplus ( archipiù i den italienske utgaven), brukt i Newspeak for superlativen. Selv om det ikke er veldig trofast mot den fiktive syntaksen som er definert i romanen med ekstrem presisjon, vil navnet høres ut som "C-issimo" og vil fortsatt konnotere C ++ som en intens forbedring av C. [2]

Beskrivelse

Standard bibliotek

1998 C++- standarden består av to deler: språkkjernen og standardbiblioteket ; sistnevnte inkluderer det meste av Standard Template Library (STL). Det er mange biblioteker for C++ som ikke er en del av standarden og det er mulig ved hjelp av ekstern lenking også å bruke biblioteker skrevet for språket C. STL var opprinnelig et tredjepartsbibliotek, utviklet av HP og senere av Silisium grafikk , før det ble innlemmet i standard C++. Standarden refererer ikke til det som "STL", da det ganske enkelt er en del av det komplette biblioteket, men mange fortsetter å bruke begrepet for å skille det fra resten av biblioteket (som I/O-strømmer, internasjonalisering, diagnostikk funksjoner osv.).

De fleste kompilatorer gir også en implementering av standardbiblioteket, inkludert STL. Det finnes også kompilator-uavhengige versjoner av STL, for eksempel STLPort . [3]

Kompilatorer

Noen kompilatorer for C ++ er: GCC (kryssplattform), Clang (tilgjengelig for mange forskjellige plattformer), MinGW ( port av GCC for Windows ), DJGPP og TerzC ++ Compiler . I tillegg til disse er det kommersielle kompilatorer som VisualC ++ , C ++ Builder (opprinnelig laget av Borland ). På macOS - operativsystemet kan du bruke Xcode -programmet .

C++-standarden spesifiserer ikke implementeringen av navnedekorasjon , unntakshåndtering og andre implementeringsspesifikke funksjoner, noe som gjør objektkode produsert av forskjellige kompilatorer inkompatibel. Imidlertid er det tredjepartsstandarder for bestemte maskiner eller operativsystemer som prøver å standardisere kompilatorer for slike plattformer, slik som ABI for C ++ [4] , og mange kompilatorer har siden standardisert disse elementene.

I mange år har forskjellige kompilatorer implementert C++-standarden med forskjellige nivåer av korrekthet, spesielt den delvise spesialiseringen av maler . Nyere versjoner av populære kompilatorer støtter nesten hele 1998 C ++-standarden.

Eksempelprogrammer (avledet fra C)

Hei Verden!

Eksempel på hello world -programmet som bruker standard C++-biblioteket (ikke STL), cout -utgangsstrømmen for å vise en melding og avslutter, returnerer ("returnere") en verdi til den anropende funksjonen, i dette tilfellet operativsystemet som har lansert programmet.

// input output bibliotek (for cout og endl) #include <iostream> // bruk standard navneområde (for å unngå å sette std :: foran // hver setning) ved å bruke navneområde std ; int main () { cout << "Hei verden!" << endl ; // returverdi av programmet returnerer 0 ; }

Forskjell i desimaler

Enkelt program som ber brukeren angi to desimaler, utgjør forskjellen og viser resultatet.

C ++ (samt C til standard C99 ) implementerer enkeltlinjekommentarer med dobbel skråstrek: // . For kommentarer på flere linjer brukes samme syntaks som for C, det vil si: / * (kommentar) * / .

#include <iostream> // for std :: cout, std :: cin og std :: endl bruker navneområde std ; int main () { // Sett inn strengen på standard utdatastrøm (skriv ut //-meldingen på skjermen) std :: endl, i tillegg til å sette inn en ny linje på //-strømmen, tømmer også buffer- cout << "skriv desimaltall" << endl ; // Definisjon av en variabel og dens type (desimal) // Det er ikke viktig at definisjonene er i begynnelsen av kodeblokken int nummer1 ; // Lesing fra standardinndatastrømmen til en desimal som skal lagres // variabel "nummer1" cin >> tall1 ; cout << "Sett inn et annet desimaltall" << endl ; int nummer2 ; cin >> nummer2 ; // Variabelen "forskjell" initialiseres med forskjellen av tallene lest int forskjell = tall1 - tall2 ; cout << forskjell << endl ; returner 0 ; }

Hovednummer

Programmet ber brukeren om flere tall og viser det største av de som er lagt inn (avbryter utførelsen når et negativt eller null tall legges inn). I tillegg til int , bruker C ++ også float for å deklarere både heltallsvariabler og ikke-heltallsvariabler.

#include <iostream> bruker navneområde std ; int main () { flyte m ( 0,0 ); flyte x ; gjøre { cout << "Skriv inn et positivt tall (negativt eller null for å avslutte):" ; cin >> x ; hvis ( x > m ) m = x ; } mens ( x > 0,0 ); cout << "Hovednummeret var" << m << endl ; returner 0 ; }

Summen av de første n naturlige tallene

Eksempel på et program som, etter å ha tastet inn et tall n, beregner og skriver ut summen av de første n naturlige tallene.

// Input output bibliotek #include <iostream> bruker navneområde std ; int main () { int n ; // Deklarasjon av variabelen n int sum = 0 ; // Jeg erklærer variabelen som skal inneholde summen og setter den lik 0 cout << "Sett inn tallet:" ; cin >> n ; // Jeg leser fra tastaturet verdien av n for ( int i = 0 ; i < n ; i ++ ) // for i som går fra 0 til n sum = sum + i ; // legg til i til den totale sum cout << "Summen av de første" << n << "naturlige tall er:" << sum << endl ; returner 0 ; }

Arealet av et rektangel

Beregningen av arealet til en flat figur som rektangelet er undereksponert her:

#include <iostream> bruker navneområde std ; int main () { flytebase , høyde , arealRektangel ; _ cout << "Dette programmet beregner arealet til et rektangel." << endl ; cout << "Hvor mye er basen verdt?" ; cin >> base ; cout << "Hvor mye er høyden?" ; cin >> høyde ; areaRektangel = base * høyde ; cout << "Området er:" << areaRettangolo << endl ; returner 0 ; }

Klassedefinisjon

#include <iostream> bruker navneområde std ; klasse melding { offentlig : Melding ( const string & subject , const string & from ) : emne_ ( emne ), fra_ ( fra ) {} const string & getSubject () const { return subject_ ; } const string & getFrom () const { return from_ ; } privat : strengemne_ ; _ streng fra_ ; };

En enkel bruk av den nylig definerte og implementerte klassen kan være:

#include <iostream> bruker navneområde std ; int main () { // Initialisering av en forekomst av Message-klassen Message mess ( "Greetings" , "Foo" ); // Hilsen fra Pippo cout << mess . getSubject () << "fra" << mess . getFra (); returner 0 ; }

Random Number Generator

I eksemplet er Mersenne Twister - algoritmen brukt . Objektet device, på Unix-systemer vil lese verdier fra /dev/random, objektet random_algorithminitialiseres med en tilfeldig verdi lest fra device. Objektet random_generator, som til slutt vil bli brukt til å generere det ønskede tilfeldige tallet, vil dra nytte av entropien oppnådd ved å ringe random_algorithm()og sørge for å produsere verdier i det angitte området under konstruksjon.

#include <iostream> #inkluder <tilfeldig> bruker navneområde std ; int main () { // Initialiser tilfeldig tallgeneratoren random_device enhet ; // Initialiser algoritmen for å generere tilfeldige tall Mersenne Twister // 19937 mt19937 random_algorithm ( device ()); // Initialiser et objekt som vil produsere tilfeldige heltall fra 0 til 100 med // uniforme sannsynligheter uniform_int_distribution < int > random_generator ( 0 , 100 ); // Tilordne "random" variabelen til et tilfeldig tall int random = random_generator ( random_algorithm ); // Rapporter tilfeldig tall generert cout << "Tilfeldig tall generert:" << random ; // Utdata: // Tilfeldig tall generert: [0, 100] returner 0 ; }

I dette tilfellet genererer programmet et tilfeldig tall mellom 100 og 0.

For loop

#include <iostream> bruker navneområde std ; int main () { for ( int tall = 1 ; tall < 10 ; tall ++ ) { // Rapporter tallet cout << "Number:" << tall << endl ; // Utdata: // "Nummer: 1" // "Nummer: 2" // "Nummer: 3" // "Nummer: 4" // "Nummer: 5" // "Nummer: 6" // "Nummer : 7 " //" Antall: 8 " //" Antall: 9 " } returner 0 ; }

Så lenge numeroden er mindre enn 10, fortsetter programmet å gjenta strengen ved Numero: 1å øke verdien numeromed én.

Inndatakontrollen

En konstruksjon som ofte finnes i C++-programmering er:

gjøre { // ... } while ( betingelse );

brukes til å gjenta utførelsen av en del av programmet avhengig av en spesifikk tilstand, oppgitt i mens.

Do -while- konstruksjonen innebærer at løkken kjøres minst én gang , siden betingelsen testes på slutten av setningene spesifisert av do.

Bruken av singelen mens innebærer i stedet at løkken aldri kan utføres, hvis tilstanden viser seg å være umiddelbart ikke verifisert.

Program: gitt to tall og en operator (+ - * /) beregne resultatet:

#include <iostream> #inkluder <grenser> bruker navneområde std ; int main () { dobbel a , b , r ; // Sette inn input: operander og tegn char s ; cout << "Sett inn den første operanden:" ; cin >> til ; cout << " \ n Sett inn den andre operanden:" ; cin >> b ; cout << " \ n Sett inn et tegn:" ; gjøre { cin >> s ; if ( s ! = '+' && s ! = '-' && s ! = '*' && s ! = '/' ) { cerr << " \ n Feil: feil tegn." << endl ; cout << "Sett inn et tegn:" ; } //! = betyr 'ikke lik', && samsvarer med den boolske AND } mens ( s ! = '+' && s ! = '-' && s ! = '*' && s ! = '/' ); // Beregning av resultatet, basert på fortegnstastet bryter ( e ) { sak '+' : r = a + b ; bryte ; sak '-' : r = a - b ; bryte ; sak '*' : r = a * b ; bryte ; default : // I tilfelle ingen av forholdene ovenfor oppstår ... r = a / b ; } cout << " \ n Resultatet" << ( char ) 0x8a << ":" << r << endl ; // 0x8a indikerer ASCII-tegnet 8A (138 i heksadesimal) eller 'e' med // grav aksent (è) (char) i parentes indikerer en støpeoperasjon, // tvungen konvertering. cin . ignorer ( numeriske_grenser < strømstørrelse > :: maks (), '\ n' ); cin . (); returner 0 ; }

I dette tilfellet ble setningen dobrukt for å forhindre at programmet fortsetter kjøringen med en sfeil parameterverdi.

Skrive filer:

Programmet vist nedenfor lager en fil kalt "test.txt" og skriver "Hello world" inn i den

// For cout #include <iostream> // For filbehandling #include <fstream> // For å unngå å skrive // ​​std :: cout, std :: end, std :: ofstream ved å bruke navneområdet std ; // hovedfunksjon int main () { cout << "Filåpning" << endl ; // Initialiser ofstream-klassen // Ved å gi konstruktøren som en parameter // Navnet på filen som skal opprettes ofstream -fil ( "test.txt" ); cout << "Skriv fil" << endl ; // Jeg skriver inne i filfilen << "Hei verden" ; cout << "Lukk fil" << endl ; // lukk filfilen . lukk (); returner 0 ; }

Merknader

  1. ^ Stroustrup: FAQ , på public.research.att.com . Hentet 22. april 2006 (arkivert fra originalen 16. juli 2012) .
  2. ^ Bjarne Stroustrup, "Notes to the Reader" , i C ++ - Language, Standard Library, Programming Principles , Addison-Wesley, 2000.
  3. ^ STLport: Velkommen! , på stlport.org .
  4. ^ C ++ ABI , på mentorembedded.github.io . Hentet 7. mai 2018 .

Bibliografi

  • Bjarne Stroustrup, C ++. Språk, standardbibliotek, programmeringsprinsipper , Pearson, 2015, s. 1279, ISBN  978-88-6518-448-6 .
  • Agostino Lorenzi, Marco Ambrosini, Sara Foresti, Objektorientert programmering og C++-språk , Atlas, 2004, s. 384, ISBN  978-88-268-1195-6 .
  • Harvey M. Deitel, Paul J. Deitel, C++. Fundamentals of programmering , Apogeo, 2014, s. 768, ISBN  978-88-387-8571-9 .
  • Andrea Domenici, Graziano Frosini, Introduksjon til programmering og elementer av datastrukturer med C++-språket , Franco Angeli Editore, 2013, s. 480, ISBN  978-88-464-6202-2 .

Relaterte elementer

Andre prosjekter

Eksterne lenker