C++

Da Wikipedia, l'enciclopedia libera.
Vai alla navigazione Vai alla ricerca
C++
linguaggio di programmazione
Logo del linguaggio
AutoreBjarne Stroustrup
Data di origine1983
Ultima versioneC++20 (dicembre 2020)
UtilizzoGenerico
ParadigmiMulti-paradigma, procedurale, funzionale, orientato agli oggetti
TipizzazioneStatica
Estensioni comuni.h .hh .hpp .hxx .h++ .cc .cpp .cxx .c++
Influenzato daC, Objective-C, Simula, ALGOL, Ada, CLU, ML
Ha influenzatoJava, C#, Python, Rust, Perl, PHP
Implementazione di riferimento
Sito webisocpp.org/

C++ (AFI: /ˈsiː plʌs plʌs/) è un linguaggio di programmazione ad uso generale creato dall'informatico danese Bjarne Stroustrup. Pubblicato per la prima volta nel 1985 come estensione del linguaggio C, è stato nel tempo esteso notevolmente. Dal 1997 C++ ha caratteristiche per la programmazione funzionale, generica e orientata agli oggetti, oltre a strutture per la gestione a basso livello della memoria. Quasi sempre implementato come linguaggio compilato, esistono molti compilatori di C++ creati da varie organizzazioni, tra cui Free Software Foundation, LLVM, Microsoft, Intel, Embarcadero, Oracle e IBM.[1]

C++ fu progettato con in mente la programmazione di sistemi e software integrati o a risorse limitate, presentando come punti salienti prestazioni, efficienza e flessibilità.[2] C++ è stato anche ritenuto utile in molti contesti, con i suoi punti di forza nell'infrastruttura e nell'ottimizzazione di risorse limitate,[2] come applicazioni, videogiochi, server (ad esempio commercio elettronico, ricerca in rete o basi dati), nonché in applicazioni dove le prestazioni sono critiche, come centralini telefonici o sonde spaziali.[3]

Bjarne Stroustrup cominciò a lavorare su C++ presso i Bell Labs dal 1979 per estendere il linguaggio C, con lo scopo di ottenere un linguaggio flessibile ed efficiente come C ma capace di permettere operazioni ad alto livello per l'organizzazione di grandi progetti.[4] A partire dal 1998, C++ è normato dall'International Organization for Standardization (ISO), che dopo la versione ISO/IEC 14882:1998, nota come C++98, ha pubblicato le versioni C++03, C++11, C++14, e C++17. L'attuale versione più recente, pubblicata nel dicembre 2020 con il nome di ISO/IEC 14882:2020, comunemente detto C++20,[4] sussume le precedenti e aggiunge nuove funzionalità nonché una libreria standard ampliata. Dal 2012, la distribuzione di nuove versioni segue un piano triennale,[5] con C++23 come prossima versione pianificata.[6]

Storia[modifica | modifica wikitesto]

Bjarne Stroustrup, autore del linguaggio.

Bjarne Stroustrup iniziò a lavorare al linguaggio nel 1979. L'idea di creare un nuovo linguaggio ebbe origine nelle sue esperienze di programmazione durante la realizzazione della tesi di laurea. Stroustrup trovò che il Simula avesse caratteristiche utili per lo sviluppo di grossi progetti software, ma il linguaggio era troppo lento per l'utilizzo pratico, mentre il BCPL risultava veloce ma troppo a basso livello per lo sviluppo di grosse applicazioni. Quando Stroustrup cominciò a lavorare ai laboratori Bell, gli fu affidato il compito di analizzare il kernel di Unix in ambito di elaborazione distribuita. Ricordandosi del lavoro della tesi, decise di aggiungere al linguaggio C alcune delle caratteristiche di Simula. Fu scelto il C perché era un linguaggio per uso generico portabile e veloce. Oltre al C ed al Simula, si ispirò a linguaggi come l'ALGOL 68, Ada, il CLU ed il linguaggio ML. Inizialmente, le funzionalità di classe, classe derivata, controllo rigoroso dei tipi e argomento di default furono aggiunte al C con Cfront. La prima versione commerciale fu distribuita nell'ottobre del 1985.[7]

Nel 1983 il nome del linguaggio fu cambiato da "C con classi" a C++. Furono aggiunte nuove funzionalità, tra cui funzioni virtuali, overloading di funzioni ed operatori, reference, costanti, controllo dell'utente della gestione della memoria, type checking migliorato e commenti nel nuovo stile ("//"). Nel 1985 fu pubblicata la prima edizione di The C++ programming Language, che fornì un'importante guida di riferimento del linguaggio, che non era ancora stato ufficialmente standardizzato. Nel 1989 fu distribuita la versione 2.0 del C++, le cui novità includono l'ereditarietà multipla, le classi astratte, le funzioni membro statiche, le funzioni membro const, e i membri protetti. Nel 1990 fu pubblicato The Annotated C++ Reference Manual, che fornì le basi del futuro standard. Le ultime aggiunte di funzionalità includono i template, le eccezioni, i namespace, i nuovi tipi di cast ed il tipo di dato booleano.

Così come il linguaggio, anche la libreria standard ha avuto un'evoluzione. La prima aggiunta alla libreria standard del C++ è stata la libreria degli stream di I/O che forniva servizi sostitutivi della libreria C tradizionale (come printf e scanf). In seguito, tra le aggiunte più significative c'è stata la Standard Template Library.

Dopo anni di lavoro, un comitato che presentava membri della ANSI e della ISO hanno standardizzato C++ nel 1998 (ISO/IEC 14882:1998). Per qualche anno seguente alla pubblicazione ufficiale degli standard, il comitato ha seguito lo sviluppo del linguaggio e ha pubblicato nel 2003 una versione corretta dello standard.

Risale al 2005 una relazione tecnica, chiamata "Technical Report 1" (in sigla TR1) che, pur non facendo ufficialmente parte dello standard, contiene un numero di estensioni alla libreria standard del C++11.

Non c'è un proprietario del linguaggio C++, che è implementabile senza dover pagare royalty. Il documento di standardizzazione stesso però è disponibile solo a pagamento.

Genesi del nome[modifica | modifica wikitesto]

La pronuncia di C++ è [ˌsiː plʌs ˈplʌs] (in inglese). Il nome fu suggerito da Rick Mascitti alla metà del 1983, quando il linguaggio veniva usato per la prima volta al di fuori dei centri di ricerca. Precedentemente il linguaggio si chiamava "C with classes" (C con classi). Il nome è un gioco di parole con un costrutto del C (dove il doppio segno più è l'operatore di autoincremento, che incrementa di una unità il valore di una variabile) insieme con la comune convenzione di aggiungere un segno più per indicare una versione potenziata. Secondo Stroustrup: «++ è l'operatore di incremento del C [...] il nome esprime la natura evoluzionaria dei cambiamenti dal C». Impiegando il gioco di parole si evita anche il problema che "C+" è già stato usato per un linguaggio senza alcun nesso col C++ (senza menzionare che è comunemente associato con una valutazione poco più che sufficiente in una performance accademica).

Quando, nel 1992, gli furono chieste informalmente spiegazioni sul nome, Rick Mascitti ha spiegato di aver dato il suggerimento con spirito goliardico, e che non pensava che quello sarebbe divenuto il nome formale del linguaggio. Stroustrup ha anche suggerito a posteriori un'interpretazione orwelliana del nome, in riferimento al "Dizionario C" della Neolingua - nel romanzo il dizionario dei termini tecnici, unico residuo di un linguaggio scientifico - descritto nell'appendice di 1984 e al prefisso doubleplus (arcipiù nell'edizione italiana), utilizzato in Neolingua per il superlativo. Benché non fedelissimo alla sintassi fittizia definita nel romanzo con estrema precisione, il nome suonerebbe come "C-issimo" e connoterebbe comunque il C++ come intenso miglioramento del C.[8]

Descrizione[modifica | modifica wikitesto]

Libreria standard[modifica | modifica wikitesto]

Lo standard del C++ del 1998 consiste di due parti: il nucleo del linguaggio e la libreria standard; quest'ultima include la maggior parte della Standard Template Library (STL) . Esistono molte librerie per il C++ che non fanno parte dello standard ed è possibile, usando il linking esterno, utilizzare anche le librerie scritte per il linguaggio C. La STL era in origine una libreria di terze parti, sviluppata da HP e in seguito da Silicon Graphics, prima che venisse incorporata nel C++ standard. Lo standard non si riferisce a essa come alla "STL", poiché è semplicemente parte della libreria completa, ma molti continuano a usare il termine per distinguerla dal resto della libreria (come flussi di I/O, internazionalizzazione, funzioni diagnostiche, ecc.).

La maggior parte dei compilatori fornisce anche un'implementazione della libreria standard, STL compresa. Esistono anche versioni indipendenti dal compilatore della STL, come ad esempio la STLPort.[9]

Compilatori[modifica | modifica wikitesto]

Alcuni compilatori per C++ sono: GCC (multipiattaforma), Clang (disponibile per molte piattaforme diverse), MinGW (porting di GCC per Windows), DJGPP e TerzC++Compiler. Oltre a questi ci sono i compilatori commerciali come VisualC++, C++ Builder (inizialmente realizzato dalla Borland). Su sistema operativo macOS, è possibile utilizzare il programma Xcode.

Lo standard del C++ non specifica l'implementazione della decorazione dei nomi, della gestione delle eccezioni e altre funzioni specifiche dell'implementazione, e ciò rende incompatibile il codice oggetto prodotto da compilatori diversi. Ci sono però standard di terze parti per particolari macchine o sistemi operativi che cercano di standardizzare i compilatori per tali piattaforme, ad esempio l'ABI per C++[10], e successivamente molti compilatori hanno standardizzato questi elementi.

Per molti anni i diversi compilatori hanno implementato lo standard del C++ con diversi livelli di correttezza, in particolare la specializzazione parziale dei template. Le versioni recenti dei compilatori più usati supportano quasi tutto lo standard del C++ del 1998.

Programmi di esempio (derivati da C)[modifica | modifica wikitesto]

Hello world![modifica | modifica wikitesto]

Esempio del programma hello world che utilizza la libreria standard C++ (non l'STL), il flusso di output cout per mostrare un messaggio e termina, restituendo ("return") un valore alla funzione chiamante, in questo caso il sistema operativo che ha lanciato il programma.

// libreria input output (per cout e endl)
#include <iostream>

// uso dello spazio dei nomi standard (per evitare di mettere std:: prima di
// ogni istruzione)
using namespace std;

int main()
{
    cout << "Hello World!" << endl;

    // valore di ritorno del programma
    return 0;
}

Differenza di decimali[modifica | modifica wikitesto]

Semplice programma che chiede all'utente di inserire due decimali, ne fa la differenza e ne visualizza il risultato.

Il C++ (come anche il C allo standard C99) implementa i commenti su riga singola tramite il doppio slash: //. Per i commenti su righe multiple si utilizza la stessa sintassi del C, ossia: /* (commento) */.

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

using namespace std;

int main()
{
    // Inserimento della stringa sullo stream di output standard (stampa il
    // messaggio a video) std::endl, oltre ad inserire una nuova linea sullo
    // stream, svuota anche il buffer
    cout << "scrivi numero decimale" << endl;

    // Definizione di una variabile e del relativo tipo (float, quindi decimale)
    // Non è importante che le definizioni siano all'inizio del blocco di codice
    float numero1;

    // Lettura dallo stream standard di input di un decimale da memorizzare
    // variabile "numero1"
    cin >> numero1;

    cout << "Inserire un altro numero decimale" << endl;
    float numero2;
    cin >> numero2;

    // La variabile "differenza" viene inizializzata con la differenza dei numeri letti
    float differenza = numero1 - numero2;
    cout << differenza << endl;

    return 0;
}

Numero maggiore[modifica | modifica wikitesto]

Il programma chiede all'utente più numeri e mostra il maggiore fra quelli inseriti (interrompendo l'esecuzione quando viene inserito un numero negativo o nullo). Oltre all'int, il c++ utilizza anche il float per dichiarare variabili sia intere sia non intere.

#include <iostream>

using namespace std;

int main()
{
    float m(0.0);
    float x;

    do
    {
        cout << "Inserire un numero positivo (negativo o nullo per uscire): ";
        cin >> x;

        if (x > m)
            m = x;
    } while (x > 0.0);

    cout << "Il numero maggiore era " << m << endl;

    return 0;
}

Somma dei primi n numeri naturali[modifica | modifica wikitesto]

Esempio di un programma che, inserito un numero n, calcola e stampa la somma dei primi n numeri naturali.

// Libreria input output
#include <iostream>

using namespace std;

int main()
{
    int n; // Dichiarazione della variabile n
    int somma = 0; // Dichiaro la variabile che conterrà la somma e la imposto uguale a 0
    cout << "Inserisci il numero: ";
    cin >> n; // leggo da tastiera il valore di n
    
    for (int i = 0; i <= n; i++) // per i che va da 0 a n
        somma = somma + i; // aggiungo i alla somma complessiva
    
    cout << "La somma dei primi " << n << " numeri naturali e': " << somma << endl;
    return 0;
}

Area di un rettangolo[modifica | modifica wikitesto]

Il calcolo dell'area di una figura piana come il rettangolo è qui sottoesposto:

#include <iostream>

using namespace std;

int main()
{
    float base, altezza, areaRettangolo;
    cout << "Questo programma calcola l'area di un rettangolo." << endl;
    cout << "Quanto vale la base? ";
    cin >> base;
    cout << "Quanto vale l'altezza? ";
    cin >> altezza;
    areaRettangolo = base * altezza;
    cout << "L'area vale: " << areaRettangolo << endl;
    return 0;
}

Definizione di Classe[modifica | modifica wikitesto]

#include <iostream>

using namespace std;

class Message
{
public:
    Message(const string& subject, const string& from):
        subject_(subject), from_(from)
    {}

    const string& getSubject() const { return subject_; }

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

private:
    string subject_;
    string from_;
};

Un semplice utilizzo della classe appena definita e implementata può essere:

#include <iostream>

using namespace std;

int main()
{
    // Inizializzazione di un'istanza della classe Message
    Message mess("Saluti", "Pippo");

    // Saluti da Pippo
    cout << mess.getSubject() << " da " << mess.getFrom();

    return 0;
}

Generatore numeri casuali[modifica | modifica wikitesto]

Nell'esempio viene usato l'algoritmo Mersenne Twister. L'oggetto device, su sistemi Unix leggerà valori da /dev/random, l'oggetto random_algorithm viene inizializzato con un valore casuale letto da device. L'oggetto random_generator, che verrà infine utilizzato per generare il numero casuale desiderato sfrutterà l'entropia ottenuta chiamando random_algorithm() e si assicurerà di produrre valori nell'intervallo specificato in costruzione.

#include <iostream>
#include <random>

using namespace std;

int main()
{
    // Inizializza il generatore di numeri casuali
    random_device device;
    // Inizializza l'algoritmo di generazione di numeri casuali Mersenne Twister
    // 19937
    mt19937 random_algorithm(device());
    // Inizializza un oggetto che produrrà interi casuali da 0 a 100 con
    // probabilità uniformi
    uniform_int_distribution<int> random_generator(0, 100);

    // Assegna alla variabile "casuale" a un numero casuale
    int casuale = random_generator(random_algorithm);
    // Comunica il numero casuale generato
    cout << "Numero casuale generato: " << casuale;
    // Output:
    // Numero casuale generato: [0, 100]

    return 0;
}

Il programma in questo caso genera un numero casuale tra 100 e 0.

Ciclo for[modifica | modifica wikitesto]

#include <iostream>
using namespace std;

int main() 
{
    
    for (int numero = 0; numero<10; numero++) 
    {
        cout<<"Numero vale: "<<numero<<endl;
    }
    
    return 0;
}

Nel caso in esempio, finché numero è minore di 10, il programma continua a ripetere la stringa Numero vale: numero incrementando ad ogni fine del ciclo il valore numero di uno (numero++).

Il controllo dell'input[modifica | modifica wikitesto]

Un costrutto che si trova spesso nella programmazione in C++ è:

do
{
    // ...
} while (condizione);

utilizzato per ripetere l'esecuzione di una parte del programma dipendente da una specifica condizione, enunciata nel while.

Il costrutto do-while implica che il ciclo sia eseguito almeno una volta, poiché la condizione è testata alla fine del corpo di istruzioni specificate dal do.

L'uso del singolo while invece implica che il ciclo possa anche non essere mai eseguito, se la condizione si trovasse ad essere subito non verificata.

Programma: dati due numeri ed un operatore (+ - * /) calcolarne il risultato:

#include <iostream>
#include <limits>

using namespace std;

int main()
{
    double a, b, r;
    // Inserimento dell'input: operandi e segno
    char s;
    cout << "Inserisci il primo operando: ";
    cin >> a;
    cout << "\nInserisci il secondo operando: ";
    cin >> b;
    cout << "\nInserisci un segno: ";
    do
    {
        cin >> s;
        if (s != '+' && s != '-' && s != '*' && s != '/')
        {
            cerr << "\nErrore: segno non corretto." << endl;
            cout << "Inserisci un segno: ";
        }

        // != significa 'non uguale a', && corrisponde alla AND booleana
    } while (s != '+' && s != '-' && s != '*' && s != '/');

    // Calcolo del risultato, in base al segno immesso
    switch (s)
    {
        case '+':
            r = a + b;
            break;
        case '-':
            r = a - b;
            break;
        case '*':
            r = a * b;
            break;
        default: // In caso nessuna delle precedenti condizioni si verifichi...
            r = a / b;
    }

    cout << "\nIl risultato " << (char) 0x8a << ": " << r << endl;
    // 0x8a indica il carattere ASCII 8A (138 in esadecimale) ovvero la 'e' con
    // accento grave (è) (char) tra parentesi indica un'operazione di cast,
    // conversione forzata.

    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    cin.get();
    return 0;
}

In questo caso, l'istruzione do è stata utilizzata per impedire al programma di proseguire l'esecuzione con un valore del parametro s non corretto.

Scrittura di file:

Il programma mostrato di seguito crea un file chiamato "prova.txt" e ci scrive dentro "Hello world".

// Per il cout
#include <iostream>

// Per la gestione dei file
#include <fstream>

// Per evitare di scrivere
// std::cout, std::end, std::ofstream
using namespace std;

// Funzione principale
int main()
{
    cout << "Apertura file" << endl;
    // Inizializzo la classe ofstream
    // Dando come parametro al costruttore
    // Il nome del file da creare
    ofstream file("prova.txt");
    cout << "Scrittura file" << endl;
    // Scrivo dentro al file
    file << "Hello world";
    cout << "Chiusura file" << endl;
    // Chiudo il file
    file.close();

    return 0;
}

Note[modifica | modifica wikitesto]

  1. ^ Bjarne Stroustrup, Notes to The Reader, in The C++ Programming Language, 3ª ed., Addison-Wesley, 1997, ISBN 0-201-88954-4, OCLC 59193992.
  2. ^ a b B. Stroustrup, Lecture:The essence of C++. University of Edinburgh., su youtube.com, 6 maggio 2014. URL consultato il 12 giugno 2015 (archiviato dall'url originale il 28 aprile 2015).
  3. ^ Bjarne Stroustrup, C++ Applications, su stroustrup.com, 17 febbraio 2014. URL consultato il 5 maggio 2014 (archiviato dall'url originale il 4 aprile 2021).
  4. ^ a b Bjarne Stroustrup's Homepage, su stroustrup.com. URL consultato il 15 maggio 2013 (archiviato dall'url originale il 14 maggio 2019).
  5. ^ C++ IS schedule (PDF), su open-std.org. URL consultato il 9 agosto 2020 (archiviato dall'url originale il 10 agosto 2020).
  6. ^ C++; Where it's heading, su dzone.com. URL consultato il 3 dicembre 2018 (archiviato dall'url originale il 3 dicembre 2018).
  7. ^ Stroustrup: FAQ, su public.research.att.com. URL consultato il 22 aprile 2006 (archiviato dall'url originale il 16 luglio 2012).
  8. ^ Bjarne Stroustrup, "Note al lettore", in C++ - Linguaggio, libreria standard, principi di programmazione, Addison-Wesley, 2000.
  9. ^ STLport: Welcome!, su stlport.org.
  10. ^ C++ ABI, su mentorembedded.github.io. URL consultato il 7 maggio 2018.

Bibliografia[modifica | modifica wikitesto]

  • (EN) Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley, ISBN 978-0-201-70073-2.
  • Bjarne Stroustrup, C++. Linguaggio, libreria standard, principi di programmazione, Pearson, 2015, p. 1279, ISBN 978-88-6518-448-6.
  • Agostino Lorenzi, Marco Ambrosini, Sara Foresti, Programmazione ad oggetti e linguaggio C++, Atlas, 2004, p. 384, ISBN 978-88-268-1195-6.
  • Harvey M. Deitel, Paul J. Deitel, C++. Fondamenti di programmazione, Apogeo, 2014, p. 768, ISBN 978-88-387-8571-9.
  • Andrea Domenici, Graziano Frosini, Introduzione alla programmazione ed elementi di strutture dati con il linguaggio C++, Franco Angeli Editore, 2013, p. 480, ISBN 978-88-464-6202-2.

Voci correlate[modifica | modifica wikitesto]

Altri progetti[modifica | modifica wikitesto]

Collegamenti esterni[modifica | modifica wikitesto]

Controllo di autoritàLCCN (ENsh87007505 · GND (DE4193909-8 · BNE (ESXX540250 (data) · BNF (FRcb12139768z (data) · J9U (ENHE987007539277905171
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica