Linguaggi di programmazione: C++
Il C++ è un linguaggio di programmazione orientato agli oggetti, con tipizzazione statica. È stato sviluppato (in origine col nome di “C con classi”) da Bjarne Stroustrup ai Bell Labs nel 1983 come un miglioramento del linguaggio C. Tra i miglioramenti principali troviamo: l’introduzione del paradigma di programmazione a oggetti, funzioni virtuali, overloading degli operatori, ereditarietà multipla, template e gestione delle eccezioni.
Il C++ fu standardizzato nel 1998 (ISO/IEC 14882:1998 “Information Technology – Programming Languages – C++”, aggiornato nel 2003). C++11, conosciuto anche come C++0x, è il nuovo standard per il linguaggio di programmazione C++ che sostituisce la revisione del 2003. L’ultima versione dello standard (nota informalmente come C++14) è stata pubblicata nel 2014.
Storia del linguaggio
Risale al 2005 un report tecnico, chiamato “Technical Report 1” (abbreviato 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.
Il nome del linguaggio
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 più “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++ (forse aggiungendo una sfumatura di disumana efficienza) come intenso miglioramento del C.
La libreria standard
Lo standard del C++ del 1998 consiste di due parti: il nucleo del linguaggio e la libreria standard del C++; quest’ultima include la maggior parte della Standard Template Library ed una versione della libreria standard del C leggermente modificata per un uso più comodo. 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 ed in seguito da Silicon Graphics, prima che venisse incorporata nel C++ standard. Lo standard non si riferisce ad essa come alla “STL”, poiché è semplicemente parte della libreria completa, ma molti continuano ad 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.
Compilatori
Alcuni compilatori per C++ sono: Clang (multipiattaforma), GCC (disponibile per molte piattaforme diverse), MinGW (porting di GCC per Windows) e DJGPP. Oltre a questi ci sono i compilatori commerciali come VisualC++, Embarcadero C++ Builder (inizialmente realizzato dalla Borland). Su sistema operativo macOS, è possibile utilizzare il programma Xcode per scrivere codici in C++. Anche se il C non è un sottoinsieme del C++ nel senso più stretto della parola, è possibile compilare in C++ molti programmi scritti in C.
Tradizionalmente i compilatori C++ hanno avuto un certo numero di problemi. 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++, ed ora 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
Hello world!
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.
#include // per EXIT_SUCCESS
#include // per std::cout e std::endl
int main()
{
std::cout << "Hello World!\n";
return EXIT_SUCCESS;
}
Nota: Lo std seguito dal doppio segno “due punti” (::) specifica il namespace da usare per la risoluzione dei simboli del programma. In particolare std indica di usare il simbolo che si trova nel namespace standard del C++. Scrivendo all’inizio del programma using namespace std si evita di dover specificare std:: prima di ogni simbolo.
Somma di interi
Semplice programma che chiede all’utente di inserire due interi, li somma 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 // per la macro EXIT_SUCCESS
#include // 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 << "Inserire un numero intero" << endl;
// Definizione di una variabile e del relativo tipo (intero)
// Non è importante che le definizioni siano all'inizio del blocco di codice
int numero1;
// Lettura dallo stream standard di input di un intero da memorizzare nella variabile "numero1"
cin >> numero1;
cout << "Inserire un altro numero intero" << endl;
int numero2;
cin >> numero2;
// La variabile "somma" viene inizializzata con la somma dei numeri letti
int somma(numero1 + numero2);
cout << somma << endl;
return EXIT_SUCCESS;
}
Numero maggiore
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
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;
}
Area Rettangolo
Il calcolo dell’area di una figura piana come il rettangolo è qui sottoesposto:
#include
using namespace std;
float base,altezza,arearettangolo;
/* qui vanno eventuali commenti sul programma*/
int main()
{
cout << "Questo programma calcola l'area di un rettangolo." << endl;
cout << "Quanto vale la base? ";
cin >> base;
cout << endl; // Serve per andare a capo dopo il cin
cout << "Quanto vale l'altezza? " << endl;
cin >> altezza;
cout << endl;
arearettangolo= base * altezza;
cout << "L'area vale: " << arearettangolo << endl;
return 0;
}
Definizione di Classe
#include
using namespace std;
class Message
{
public:
Message(const string& subject, const string& from) :
subject_(subject), from_(from) {}
const string& subject() const { return subject_; }
const string& from() const { return from_; }
private:
string subject_;
string from_;
};
Essendo specificato std come namespace generale, non è necessario indicare il namespace per la risoluzione di ogni simbolo (std::).
Generatore numeri casuali
#include
#include
#include
using namespace std;
int main()
{
// Inizializza il generatore di numeri casuali
srand(unsigned(time(NULL)));
// Inizializza la variabile "casuale" a un numero casuale
int casuale = (rand()%100) + 1;
// Comunica il numero casuale generato
cout << "Numero casuale generato: " << casuale;
// Output:
// Numero casuale generato: 45
return 0;
}
Il programma in questo caso genera un numero casuale tra 100 e 1.
Ciclo for
#include
using namespace std;
int main()
{
for(int numero = 1; numero < 10; numero++)
{
// Comunica il numero
cout << "Numero: " << numero << endl;
// Output:
// "Numero: 1"
// "Numero: 2"
// "Numero: 3"
// "Numero: 4"
// "Numero: 5"
// "Numero: 6"
// "Numero: 7"
// "Numero: 8"
// "Numero: 9"
}
return 0;
}
Finché numero
non è uguale a 10, il programma continua a ripetere la stringa Numero: 1
incrementando il valore numero
di uno.
Il controllo dell’input
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
#include
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: ";
}
}
while ( s != '+' && s != '-' && s != '*' && s != '/' ); // != significa 'non uguale a', && corrisponde alla AND booleana
// 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.
Bibliografia
- (EN) Bjarne Stroustrup, The C++ Programming Language, Addison-Wesley.
- Bjarne Stroustrup, C++. Linguaggio, libreria standard, principi di programmazione, Pearson, 2015, pp. 1279.
- Agostino Lorenzi, Marco Ambrosini, Sara Foresti, Programmazione ad oggetti e linguaggio C++, Atlas, 2004, pp. 384.
- Harvey M. Deitel, Paul J. Deitel, C++. Fondamenti di programmazione, Apogeo, 2014, pp. 768.
- Andrea Domenici, Graziano Frosini, Introduzione alla programmazione ed elementi di strutture dati con il linguaggio C++, Franco Angeli Editore, 2013, pp. 480, .
Fonte: Wikipedia
Antonio De Lisa – Segni, Suoni, Scritture / Signs, Sounds, Writings
© 2000-18
Sede e Contatti – Location and Contacts: Antonio De Lisa
c/o LOST ORPHEUS MULTIMEDIA – Via del Popolo, 127/129
85100 POTENZA (ITALY) (0)39- 097137457 / Cell. 3333878854Site: www.adelisa.it
E-mail: lostorpheusmedia@gmail.com
Testi pubblicati per studio e ricerca – Uso non commerciale
Texts published for study and research-non-commercial useThis opera is licensed under a Creative Commons Attribuzione – Condividi allo stesso modo 3.0 Unported License.
Rispondi