Dal C al C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 306:
 
Le funzioni "doppioN" sono equivalenti, tanto che il programma stamperà "222".
Ma consideriamo il seguente programma:
 
#include <iostream>
Line 322 ⟶ 323:
}
 
Le funzioni "raddoppiaN" ''non'' sono equivalenti, tanto che il programma stamperà "124".
 
Chiamando la funzione "raddoppia1", il valore dell'oggetto riferito dalla variabile "x" viene copiato sullo stack.
Line 341 ⟶ 342:
Come si vede, il corpo della funzione "raddoppia3" è uguale a quello della funzione "raddoppia1", ma il comportamento è uguale a quello della funzione "raddoppia2".
Questi fatti si esprimono con la frase: '''I riferimenti hanno la sintassi dei valori, ma la semantica dei puntatori'''.
 
== Il modificatore "const" ==
In C++ esiste la parola-chiave "const" (abbreviazione di "constant", cioè "costante"), che serve a modificare la dichiarazione di variabili e funzioni.
Ecco alcuni esempi di utilizzo:
const int x1 = 0;
const int *x2;
int * const x3 = 0;
const int * const x4 = 0;
La variabile "x1" è tipo "int", ed è non modificabile.
L'inizializzazione è obbligatoria, in quanto non gli si potrà assegnare un valore in seguito.
 
La variabile "x2" è di tipo puntatore a un "int" non modificabile, ma la variabile "x2" è modificabile.
 
La variabile "x3" è di tipo puntatore non modificabile a un "int" modificabile.
 
La variabile "x4" è di tipo puntatore non modificabile a un "int" non modificabile.
 
Vediamo quali sono gli utilizzi ammessi e quali quelli vietati dal compilatore:
x1 = 1; // Illegale
x2 = 0; // OK
*x2 = 1; // Illegale
x3 = 0; // Illegale
*x3 = 1; // OK
x4 = 0; // Illegale
*x4 = 1; // Illegale
 
Il modificatore "const" si può applicare anche ai parametri di qualunque funzione, e alle funzioni membro stesse.
Per esempio:
void f1(const int &x5) { }
class C {
int x6;
void f2() const { }
};
 
Il parametro "x5" è di tipo riferimento a un "int" non modificabile.
Un riferimento non può mai essere reindirizzato a un altro oggetto, pertanto la seguente riga è erronea:
void f1(int & const x5) { } // Illegale
 
Nella classe "C", la funzione membro "f2" non prende argomenti, ma presenta la parola "const" appena prima del corpo.
Tale specificazione asserisce che quella funzione non può modificare le variabili membro dell'oggetto su cui è chiamata.
In quesl caso la parola "const" andrebbe letta come "che non modifica l'oggetto".
Per esempio, il seguente codice è illegale.
class C {
int x6;
void f2() const { x6 = 0; }
};
 
Gli scopi del modificatore "const" sono i seguenti:
* Rendere il codice autodocumentante e quindi più comprensibile. Il programmatore potrebbe scrivere un commento come "questa routine si limita a leggere l'oggetto", ma oltre a essere più verboso e meno standard, il compilatore non potrebbe assicurare la veridicità di tale commento.
* Evidenziare errori di programmazione. Se una variabile con deve essere modificata e invece lo è, si tratta di un errore logico che verrà segnalato dal compilatore.
* Rendere il codice più efficiente. Se il compilatore sa che una variabile ha un valore costante, può propagare il suo valore ovunque è usata la variabile. Per variabili locali, questo viene già fatto dai compilatori ottimizzanti, ma normalmente non viene fatto per le variabili globali. Questo fatto rende inutile e sconsigliato l'uso delle macro del preprocessore per definire costanti.
 
{{wikipedia|titolopedia=C plus plus|titolobooks=il linguaggio C++}}