C ++

De la Viquipèdia, l'enciclopèdia lliure.
Saltar a la navegació Saltar a la cerca
C ++
llenguatge de programació
Logotip ISO C ++.svg
Autor Bjarne Stroustrup
Data d’origen 1983
Última versió C ++ 20 (desembre de 2020)
Ús Genèric
Paradigmes Multi-paradigma, procedimental , funcional , orientat a objectes
Escrivint Estàtic
Extensions comunes .h .hh .hpp .hxx .h ++ .cc .cpp .cxx .c ++
Influenciat per C , Objective-C , Simula , ALGOL , Ada , CLU , ML
Va influir Java , C # , Python , Rust , Perl , PHP
Implementació de referència
Lloc web isocpp.org/

En informàtica, C ++ és un llenguatge de programació de propòsit general desenvolupat originalment per Bjarne Stroustrup a Bell Labs el 1983 com a evolució del llenguatge C mitjançant la inserció de programació orientada a objectes ; amb el pas del temps ha tingut evolucions significatives, com la introducció de l’abstracció respecte al tipus.

El llenguatge es va normalitzar el 1998 ( ISO / IEC 14882 : 1998 "Tecnologia de la informació - Llenguatges de programació - C ++", actualitzat el 2003 ). C ++ 11 , també conegut com a C ++ 0x , és l'estàndard que substitueix la revisió de 2003. Després d'una revisió menor el 2014, el 2017 es va publicar l'última versió de l'estàndard (coneguda informalment com C ++ 17 ).

Història

Bjarne Stroustrup , autora de la llengua.

Bjarne Stroustrup va començar a treballar la llengua el 1979 . La idea de crear un llenguatge nou es va originar en les seves experiències de programació durant la realització de la seva tesi de llicenciatura. Stroustrup va trobar que el Simula tenia funcions útils per al desenvolupament de grans programes de programari, però el llenguatge era massa lent per al seu ús pràctic, mentre que el BCPL era ràpid però massa baix per al desenvolupament d'aplicacions grans. Quan Stroustrup va començar a treballar als Bell Labs, se li va donar la tasca d’analitzar el nucli Unix en el camp del processament distribuït . Recordant el treball de la tesi, va decidir afegir algunes de les característiques de Simula al llenguatge C. C es va escollir perquè era un llenguatge d’ús general ràpid i portàtil . A més de C i Simula, es va inspirar en llenguatges com ALGOL 68 , Ada , CLU i el llenguatge ML . Inicialment, les característiques de classe , classe derivada , comprovació estricta de tipus i argument per defecte es van afegir a C amb Cfront . La primera versió comercial es va publicar a l'octubre de 1985 . [1]

El 1983 es ​​va canviar el nom de l'idioma de "C amb classes" a C ++. Es van afegir noves funcions, incloses funcions virtuals , sobrecàrrega de funcions i operadors, referències , constants, control per part de l'usuari de la gestió de memòria, comprovació de tipus millorada i comentaris al nou estil ("//"). El 1985 es va publicar la primera edició del llenguatge de programació C ++ , que proporcionava una important guia de referència per al llenguatge, que encara no s’havia normalitzat oficialment. El 1989 es va llançar la versió 2.0 de C ++, les noves característiques de les quals inclouen herència múltiple , classes abstractes , funcions de membre estàtic , funcions de membre const i membres protegits . El 1990 es va publicar The Annotated C ++ Reference Manual , que va proporcionar les bases per al futur estàndard. Les darreres incorporacions de funcions inclouen plantilles , excepcions , espais de noms , nous tipus de repartiment i el tipus de dades booleà .

Igual que el llenguatge, la biblioteca estàndard també ha evolucionat. La primera incorporació a la biblioteca estàndard C ++ va ser la biblioteca de flux d' E / S que proporcionava serveis de substitució de la biblioteca C tradicional (com ara printf i scanf ). Més tard, una de les incorporacions més significatives va ser la Biblioteca de plantilles estàndard .

Després d’anys de treball, el 1998 es va formar un comitè amb membres de l’ANSI i la norma ISO C ++ ( ISO / IEC 14882 : 1998 ). Durant uns anys després de la publicació oficial de les normes, el comitè va seguir el desenvolupament de la llengua i va publicar una versió corregida de la norma el 2003 .

Un informe tècnic es remunta al 2005 , anomenat "Informe tècnic 1" (abreujat TR1) que, encara que no forma part oficialment de l'estàndard, conté diverses extensions de la biblioteca estàndard C ++ 11 .

No hi ha cap propietari del llenguatge C ++, que es pugui implementar sense pagar royalties. Tanmateix, el document de normalització en si només està disponible de pagament.

Gènesi del nom

La pronunciació de C ++ és [ˌsiː plʌs ˈplʌs] (en anglès). El nom va ser suggerit per Rick Mascitti a mitjan 1983 , quan la llengua es va utilitzar per primera vegada fora dels centres de recerca. Anteriorment, l'idioma es deia "C amb classes". El nom és un joc de paraules amb una construcció en C (on el signe doble més és l’operador d’increment automàtic, que augmenta el valor d’una variable) juntament amb la convenció comuna d’afegir un signe més per indicar una versió millorada. Segons Stroustrup: «++ és l'operador d'increment de C [...] el nom expressa la naturalesa evolutiva dels canvis de C» . Emprar el joc de paraules també evita el problema que "C +" ja s'ha utilitzat per a un llenguatge sense connexió amb C ++ (per no mencionar que normalment s'associa a una avaluació poc més que suficient en un rendiment acadèmic).

Quan, el 1992, se li va preguntar de manera informal sobre el nom, Rick Mascitti va explicar que havia fet el suggeriment amb esperit goliard i que no pensava que es convertís en el nom formal de la llengua. Stroustrup també va suggerir a posteriori una interpretació orwelliana del nom, referint-se al "Diccionari C" de Newspeak - a la novel·la el diccionari de termes tècnics, l'únic romanent d'un llenguatge científic - descrit a l'apèndix de 1984 i al prefix doubleplus ( archipiù en l’edició italiana), que s’utilitza a Newspeak per al superlatiu. Tot i que no és molt fidel a la sintaxi fictícia definida a la novel·la amb una precisió extrema, el nom sonaria a "C-issimo" i encara connotaria C ++ com una intensa millora de C. [2]

Descripció

Biblioteca estàndard

L' estàndard C ++ del 1998 consta de dues parts: el nucli del llenguatge i la biblioteca estàndard ; aquest últim inclou la major part de la Biblioteca de plantilles estàndard (STL). Hi ha moltes biblioteques per a C ++ que no formen part de l’estàndard i és possible, mitjançant enllaços externs, fer servir també biblioteques escrites per al llenguatge C. La STL era originalment una biblioteca de tercers, desenvolupada per HP i posteriorment per Silicon: gràfics , abans que s'incorporessin a l'estàndard C ++. L'estàndard no s'hi refereix com a "STL", ja que simplement forma part de la biblioteca completa, però molts continuen utilitzant el terme per distingir-lo de la resta de la biblioteca (com ara fluxos d'E / S, internacionalització, diagnòstic) funcions, etc.).

La majoria dels compiladors també proporcionen una implementació de la biblioteca estàndard, inclosa la STL. També hi ha versions de STL independents del compilador, com ara STLPort . [3]

Compiladors

Alguns compiladors per a C ++ són: GCC (multiplataforma), Clang (disponible per a moltes plataformes diferents), MinGW ( port de GCC per a Windows ), DJGPP i TerzC ++ Compiler . A més d'aquests, hi ha compiladors comercials com VisualC ++ , Embarcadero Delphi , C ++ Builder (fabricat inicialment per Borland ). Al sistema operatiu macOS , podeu utilitzar el programa Xcode .

L'estàndard C ++ no especifica la implementació de la decoració de noms, la gestió d'excepcions i altres funcions específiques de la implementació, cosa que fa incompatible el codi objecte produït per diferents compiladors. No obstant això, hi ha estàndards de tercers per a màquines o sistemes operatius particulars que intenten estandarditzar els compiladors per a aquestes plataformes, com ara ABI per a C ++ [4] , i molts compiladors han normalitzat aquests elements.

Durant molts anys, diferents compiladors han implementat l'estàndard C ++ amb diferents nivells de correcció, en particular l' especialització parcial de plantilles . Les versions recents de compiladors populars admeten gairebé tots els estàndards C ++ del 1998.

Programes d'exemple (derivats de C)

Hola món!

Exemple del programa hello world que utilitza la biblioteca C ++ estàndard (no l'STL), el flux de sortida de cout per mostrar un missatge i finalitza, retornant ("retorn") un valor a la funció de trucada, en aquest cas el sistema operatiu que ha posat en marxa el programa.

 // biblioteca de sortida d'entrada (per a cout i endl)
#include <iostream>

// utilitzeu l'espai de noms estàndard (per evitar posar std :: abans
// cada afirmació)
utilitzant l' espai de noms std ;

int main ()
{
    cout << "Hola món!" << endl ;

    // retorn del valor del programa
    retorn 0 ;
}

Diferència de decimals

Programa senzill que demana a l'usuari que introdueixi dues dècimes, marca la diferència i mostra el resultat.

C ++ (així com C a l'estàndard C99 ) implementa comentaris d'una sola línia mitjançant doble barra: // . Per als comentaris sobre diverses línies, s’utilitza la mateixa sintaxi que per a C, és a dir: / * (comentari) * / .

 #include <iostream> // per a std :: cout, std :: cin i std :: endl

utilitzant l' espai de noms std ;

int main ()
{
    // Col·loqueu la cadena al flux de sortida estàndard (imprimiu el fitxer
    // missatge a la pantalla) std :: endl, a més d'inserir una nova línia al fitxer
    // stream, també esborra la memòria intermèdia
    cout << "escriu un número decimal" >>

    // Definició d'una variable i el seu tipus (decimal)
    // No importa que les definicions es trobin al començament del bloc de codi
    número int 1 ;

    // Llegiu des del flux d’entrada estàndard d’un decimal que cal emmagatzemar
    // variable "número1"
    cin >> número1 ;

    cout << "Inseriu un altre número decimal" << endl ;
    número int 2 ;
    cin >> número2 ;

    // La variable "diferència" s'inicialitza amb la diferència dels números llegits
    int diferència = número1 - número2;
    cout << diferència << endl ;

    retorn 0 ;
}

Major nombre

El programa demana a l'usuari més números i mostra el més gran dels que ha introduït (interrompent l'execució quan s'introdueix un número negatiu o nul). A més d’ int , C ++ també utilitza float per declarar variables enteres i no enteres.

 #include <iostream>

utilitzant l' espai de noms std ;

int main ()
{
    flotador m ( 0,0 );
    flotar x ;

    fer
    {
        cout << "Introduïu un número positiu (negatiu o nul per sortir):" ;
        cin >> x ;

        si ( x > m )
            m = x ;
    } while ( x > 0,0 );

    cout << "El nombre principal era" << m << endl ;

    retorn 0 ;
}

Suma dels primers n nombres naturals

Exemple de programa que, després d’introduir un número n, calcula i imprimeix la suma dels primers n nombres naturals.

 // Biblioteca de sortida d’entrada
#include <iostream>

utilitzant l' espai de noms std ;

int main ()
{
    int n ; // Declaració de variable n
    int suma = 0 ; // Declaro la variable que contindrà la suma i l'estableixo a 0
    cout << "Inseriu el número:" ;
    cin >> n ; // llegeix el valor de n des del teclat
    
    for ( int i = 0 ; i < n ; i ++ ) // per a i que va de 0 a n
        suma = suma + i ; // afegir i a la suma total
    
    cout << "La suma dels nombres naturals primers" << n << "és:" << sum << endl ;
    retorn 0 ;
}

Àrea d'un rectangle

El càlcul de l’àrea d’una figura plana com el rectangle no està exposat aquí:

 #include <iostream>

utilitzant l' espai de noms std ;

int main ()
{
    base flotant , alçada , àreaRectangle ;
    cout << "Aquest programa calcula l'àrea d'un rectangle." << endl ;
    cout << "Quant val la base?" ;
    cin >> base ;
    cout << "Quant costa l'alçada?" ;
    cin >> alçada ;
    àreaRectangle = base * alçada ;
    cout << "La zona és:" << areaRettangolo << endl ;
    retorn 0 ;
}

Definició de classe

 #include <iostream>

utilitzant l' espai de noms std ;

missatge de classe
{
públic:
    Missatge ( const string & subject , const string & from ) :
        assumpte_ ( assumpte ), des de_ ( des )
    {}

    cadena const & getSubject () const { retorna subject_ ; }

    cadena const & getFrom () const { return from_ ; }

privat :
    string subject_ ;
    cadena de_ ;
};

Un ús senzill de la nova classe implementada i definida pot ser:

 #include <iostream>

utilitzant l' espai de noms std ;

int main ()
{
    // Inicialització d'una instància de la classe Message
    Missatge desordenat ( "Salutacions" , "Goofy" );

    // Salutacions de Pippo
    cout << embolic . getSubject () << "des de" << mess . getFrom ();

    retorn 0 ;
}

Generador de números aleatoris

En l'exemple s'utilitza l'algorisme de Mersenne Twister . L'objecte device , en sistemes Unix, llegirà els valors de /dev/random ; l'objecte random_algorithm s'inicialitza amb un valor aleatori llegit des del device . L'objecte random_generator , que finalment s'utilitzarà per generar el nombre aleatori desitjat, aprofitarà l'entropia obtinguda trucant a random_algorithm() i assegureu-vos de produir valors en l'interval especificat en construcció.

 #include <iostream>
#include <random>

utilitzant l' espai de noms std ;

int main ()
{
    // Inicialitzeu el generador de números aleatoris
    dispositiu aleatori ;
    // Inicialitzeu l'algorisme de generació de nombres aleatoris de Mersenne Twister
    // 19937
    mt19937 random_algorithm ( device ());
    // Inicialitzeu un objecte que produeixi enters aleatoris de 0 a 100 amb
    // probabilitats uniformes
    uniform_int_distribution < int > random_generator ( 0 , 100 );

    // Assigneu la variable "aleatori" a un número aleatori
    int random = random_generator ( random_algorithm );
    // Informeu del nombre aleatori generat
    cout << "Número aleatori generat:" << aleatori ;
    // Sortida:
    // Número aleatori generat: [0, 100]

    retorn 0 ;
}

En aquest cas, el programa genera un número aleatori entre 100 i 0.

Per a bucle

 #include <iostream>

utilitzant l' espai de noms std ;

int main ()
{
    per a ( número int = 1 ; nombre < 10 ; nombre ++ )
    {
        // Notifiqueu el número
        cout << "Número:" << número << endl ;
        // Sortida:
        // "Número 1"
        // "Número: 2"
        // "Número: 3"
        // "Número: 4"
        // "Número: 5"
        // "Número: 6"
        // "Número: 7"
        // "Número: 8"
        // "Número: 9"
    }

    retorn 0 ;
}

Mentre el numero sigui inferior a 10, el programa continua repetint la cadena Numero: 1 incrementant el valor numero en un.

El control de l'entrada

Una construcció que es troba sovint a la programació C ++ és:

 fer
{
    // ...
} while ( condició );

s'utilitza per repetir l'execució d'una part del programa que depèn d'una condició específica, indicada en el moment.

La construcció do-while implica que el bucle s’executa com a mínim una vegada , ja que la condició es prova al final del cos d’instruccions especificat pel do.

En canvi, l’ús del single while implica que el bucle mai no es pot executar si es comprova que la condició no es verifica immediatament.

Programa: es donen dos nombres i un operador (+ - * /) calcula el resultat:

 #include <iostream>
#include <limits>

utilitzant l' espai de noms std ;

int main ()
{
    doble a , b , r ;
    // Inseriu entrada: operands i signe
    char s ;
    cout << "Inseriu el primer operand:" ;
    cin >> a ;
    cout << " \ n Inseriu el segon operand:" ;
    cin >> b ;
    cout << " \ n Inseriu un signe:" ;
    fer
    {
        cin >> s ;
        if ( s ! = '+' && s ! = '-' && s ! = '*' && s ! = '/' )
        {
            cerr << " \ n Error: signe incorrecte." << endl ;
            cout << "Insereix un signe:" ;
        }

        //! = significa 'no és igual a', && correspon al AND booleà
    } while ( s ! = '+' && s ! = '-' && s ! = '*' && s ! = '/' );

    // Càlcul del resultat, a partir del signe introduït
    interruptor ( s )
    {
        cas '+' :
            r = a + b ;
            trencar ;
        cas '-' :
            r = a - b ;
            trencar ;
        cas '*' :
            r = a * b ;
            trencar ;
        per defecte : // En cas que no es produeixi cap de les condicions anteriors ...
            r = a / b ;
    }

    cout << " \ n El resultat" << ( char ) 0x8a << ":" << r << endl ;
    // 0x8a indica el caràcter ASCII 8A (138 en hexadecimal) o la "e" amb
    // accent greu (è) (caràcter) entre claudàtors indica una operació de repartiment,
    // conversió forçada.

    cin. ignora ( límit numèrics < mida de corrent > :: max (), '\ n' );
    cin. get ();
    retorn 0 ;
}

En aquest cas, la sentència do es va utilitzar per evitar que el programa continués l'execució amb un valor de paràmetre s incorrecte.

Escriptura de fitxers:

El programa que es mostra a continuació crea un fitxer anomenat "test.txt" i hi escriu "Hello world"

 // Per al cout
#include <iostream>

// Per a la gestió de fitxers
#include <fstream>

// Per evitar escriure
// std :: cout, std :: end, std :: ofstream
utilitzant l' espai de noms std ;

// Funció principal
int main ()
{
    cout << "Obertura del fitxer" << endl ;
    // Inicialitzar la classe ofstream
    // Donant com a paràmetre al constructor
    // El nom del fitxer a crear
    fitxer ofstream ( "test.txt" );
    cout << "Escriu un fitxer" << endl ;
    // Escric al fitxer
    arxiu << "Hola món" ;
    cout << "Tanca el fitxer" << endl ;
    // Tanca el fitxer
    arxiu . close ();

    retorn 0 ;
}

Nota

  1. ^ Stroustrup: FAQ , a public.research.att.com . Consultat el 22 d'abril de 2006 (arxivat de l' original el 16 de juliol de 2012) .
  2. Bjarne Stroustrup, "Notes al lector" , en C ++ - Llenguatge, biblioteca d'estàndards, principis de programació , Addison-Wesley, 2000.
  3. ^ STLport: Benvingut! , a stlport.org .
  4. ^ C ++ ABI , a mentorembedded.github.io . Consultat el 7 de maig de 2018 .

Bibliografia

  • Bjarne Stroustrup, C ++. Llenguatge, Biblioteca estàndard, Principis de programació , Pearson, 2015, p. 1279, ISBN 978-88-6518-448-6 .
  • Agostino Lorenzi, Marco Ambrosini, Sara Foresti, Programació orientada a objectes i llenguatge C ++ , Atlas, 2004, p. 384, ISBN 978-88-268-1195-6 .
  • Harvey M. Deitel, Paul J. Deitel, C ++. Fonaments de la programació , Apogeo, 2014, p. 768, ISBN 978-88-387-8571-9 .
  • Andrea Domenici, Graziano Frosini, Introducció a la programació i elements d’estructures de dades amb el llenguatge C ++ , Franco Angeli Editore, 2013, p. 480, ISBN 978-88-464-6202-2 .

Articles relacionats

Altres projectes

Enllaços externs

Controllo di autorità LCCN ( EN ) sh87007505 · GND ( DE ) 4193909-8 · BNF ( FR ) cb12139768z (data) · BNE ( ES ) XX540250 (data)
Informatica Portale Informatica : accedi alle voci di Wikipedia che trattano di informatica