Dal C al C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 35:
const string s = "Risultato: "; // s è un oggetto stringa
try {
pc2 = new complex<double>(5, std::min(17, 12));
} catch (const exception &e...) {
cerr << "Memoria insufficiente\n" << endl;
return 1;
}
vector<complex<double> > vcd;
vcd.push_back(c1 + *pc2);
cout << s << vcd.front() << endl;
delete pc2;
}
Riga 100:
Quando in codice contenuto all'interno di un blocco "try" solleva un'eccezione, il controllo passa immediatamente alla fine del blocco "try" stesso, dove c'è il blocco "catch".
 
pc2 = new complex<double>(5, std::min(17, 12));
Questa riga contiene una chiamata all'operatore "new", che è l'operatore predefinito per allocare dinamicamente oggetti nella memoria libera.
È simile alla funzione "malloc", ma mentre quest'ultima alloca una sequenza di byte, l'operatore new alloca lo spazio necessario per contenere un oggetto del tipo specificato, ed eventualmente inizializza tale oggetto.
Inoltre, il puntatore reso da "new" non è di tipo puntatore a ''void'', bensì di tipo puntatore a un oggetto della classe specificata.
La riga sopra alloca lo spazio per un oggetto di tipo "complex<double>", inizializza tale oggetto con i valori passati tra parentesi, e assegna alla variabile "pc2" un puntatore a tale oggetto.
L'inizializzatore ha due argomenti; il primo è la costante "5", che diventerà la parte reale del numero complesso; il secondo è ottenuto dalla valutazione dell'espressione "min(17, 12)".
La funzione della libreria standard "min" prende due argomenti dello stesso tipo e rende quello dei due di valore inferiore.
Non si tratta di una semplice funzione, ma di un template di funzione, in quanto, al variare del tipo degli argomenti, rappresenta una funzione diversa. In questo caso, è una funzione che prende due espressioni di tipo "int" e rende un valore di tipo "int".
 
} catch (const exception &e...) {
Questa riga inizia il blocco "catch" dell'istruzione "try/catch".
Questa riga ...
Se all'interno del blocco "try" precedente viene sollevata un'eccezione, il controllo passa all'interno di questo blocco che quindi costituisce il gestore dell'eccezione.
 
cerr << "Memoria insufficiente" << endl;
Questa riga ...
 
cerr << "Memoria insufficiente\n" << endl;
return 1;
Queste due righe costituiscono il corpo del blocco "catch" e vengono eseguita solo se nell'esecuzione del blocco "try" viene sollevata un'eccezione.
Questa riga ...
Siccome l'unica eccezione che poteva essere sollevata dal codice contenuto nel blocco "try" era l'eccezione di fallimento di allocazione della memoria, qui si avvisa l'utente che non è stato possibile allocare la memoria necessaria alla prosecuzione del programma, e si termina il programma.
L'oggetto "cerr" rappresenta lo stream di uscita dei messaggi d'errore su console ("CERR" sta per Console ERRor stream).
Corrisponde allo stream "stderr" della libreria standard del linuaggio C, dichiarato nel file di intestazione "stdio.h".
L'operatore "<<", oltre ad essere l'operatore di scorrimento a sinistra dei bit in una variabile intera, se usata su uno stream è l'operatore di inserimento, cioè di uscita.
usando tale operatore tra uno stream di uscita e un'espressione di tipo stringa, tale stringa viene inserita nello stream.
Siccome "cerr" è uno stream collegato alla console, l'effetto è di stampare la stringa sulla console.
 
vector<complex<double> > vcd;
Questa riga definisce sullo stack una variabile di nome "vcd" e di tipo "vector<complex<double> >", senza inizializzarla esplicitamente.
Questa riga ...
Il template di classe "vector" definisce un array dinamico, cioè di lunghezza variabile nel corso della sua esistenza.
Se non specificato diversamente, come in questo caso, la sua lunghezza iniziale è zero.
Il tipo degli elementi contenuti in un ''vector'' è specificato tra parentesi angolari.
In questo caso, gli elementi contenuti sono di tipo "complex<double>".
Sebbene non ci sia un inizializzatore esplicito, gli oggetti di un tipo istanziato da ''vector'' vengono inizializzati implicitamente.
Pertanto, dopo questa dichiarazione, l'oggetto rappresentato dalla variabile "vcd" contiene un array dinamico di numeri complessi a precisione ''double'', che inizialmente non contiene nessun elemento.
 
vcd.push_back(c1 + *pc2);
Questa riga applica all'oggetto "vcd" la ''funzione membro'' (chiamata anche ''metodo'') "push_back", passandole un parametro.
Questa riga ...
La funzione "push_back", serve ad aggiungere un elemento in fondo a un contenitore sequenziale.
L'elemento che verrà aggiunto al ''vector'' è il parametro della funzione.
In questo caso è un'espressione, che dovrà essere prim valutata.
Sia "c1" che "*pc2" sono oggetti di tipo "complex<double>".
L'operatore "+" oltre che essere l'operatore di somma tra numerosi tipi predefiniti (come "int" e "double"), è stato ridefinito come operatore di somma tra due oggetti di un tipo istanziato da "complex".
Pertanto l'espressione "c1 + *pc2" effettua la somma tra due numeri complessi e rende un altro numero complesso temporaneo.
Il numero complesso generato dalla somma viene subito dopo aggiunto in fondo al ''vector'' "vcd".
 
cout << s << vcd.front() << endl;
Questa riga usa un altro oggetto di tipo stream su console, "cout", che rappresenta lo stream di uscita su console ("COUT" sta per Console OUTput stream).
Questa riga ...
Corrisponde allo stream "stdout" della libreria standard del linuaggio C, dichiarato nel file di intestazione "stdio.h".
L'espressione "cout << s" ha l'effetto di stampare sulla console la stringa contenuta nella variabile "s".
Il valore di tale espressione non è "void", ma è l'oggetto "cout" stesso.
Pertanto la successiva espressione "<< vcd.front()" esegue un'altra operazione di uscita sulla console.
Questa volta l'espressione inviata in uscita non è una semplice stringa, bensì il valore reso dall'applicazione della funzione membro "front" all'oggetto "vcd".
La funzione membro "front" non richiede parametri e rende il primo valore di una collezione.
Nel nostro caso, rende il numero complesso che è stato inserito nell'istruzione precedente.
Come si vede, l'operatore di inserimento in stream ("<<") non accetta solo stringhe, ma anche altri tipi; in questo caso un'espressione di tipo "complex<double>".
 
delete pc2;
Questa riga distrugge dalla memoria l'oggetto il cui indirizzo si trova nel puntatore "pc2".
Questa riga ...
Corrisponde alla funzione "free" della libreria standard del linguaggio C, ma è applicabile solo a indirizzi resi da chiamate a "new".
 
{{wikipedia|titolopedia=C plus plus|titolobooks=il linguaggio C++}}