giovedì 18 aprile 2013

Lo strano caso della parola chiave const in C++

L'uso più scontato ed inflazionato della parola chiave const in C++ è sicuramente quello che vede coinvolte le costanti, in sostituzione della dichiarazione C-Like che prevede l'uso di una #define

Esempio:

// Dichiarazione C:
#define MIA_COSTANTE_NUMERICA 5;

//Dichiarazione C++
const int MIA_COSTANTE_NUMERICA = 5;

In questo caso la variabile  MIA_COSTANTE_NUMERICA, come il nome suggerisce, assume un valore iniziale che non può essere più cambiato all'interno del programma.


La parola chiave const, però, legata sempre al concetto di costante, può essere posta, nell'uso con variabili puntatore, anche in altre posizioni assumendo un significato diverso e permettendo utilizzi diversi alla variabile a cui è associata.
Vediamo un breve listato di codice che illustra i possibili usi ed abusi con i relativi messaggi di errore. (il compilatore usato è quello Microsoft).
int _tmain(int argc, _TCHAR* argv[])
{
 int var = 1;

 int var2 = 2;

 const int MIA_VAR_COSTANTE = 7;

 MIA_VAR_COSTANTE = 5; // Errore C3892

 // puntatore ad una costante numerica
 const int* ptrConstVar = &var;

 std::cout << *ptrConstVar << std::endl;

 *ptrConstVar = 5; // Errore C3892

// lecito, perché si cambia la locazione a cui si punta, ma non il valore
 ptrConstVar = &var2; 

 std::cout << *ptrConstVar << std::endl;

 // puntatore costante ad una variabile numerica 
 int* const constPtrVar = &var;

 constPtrVar = &var2; // Errore C3892 

 std::cout << *constPtrVar << std::endl;

 /* il puntatore alla locazione di memoria ora non viene cambiato, 
  ma ne possiamo cambiare il contenuto cambiando, di conseguenza, 
 anche il valore della variabile var. */
 *constPtrVar = 3;

 std::cout << *constPtrVar << "ed ora var = " << var << std::endl;

// puntatore costante ad una costante numerica
 const int* const ConstPtrConstVar = &var;

 *ConstPtrConstVar = 3; // Errore C3892 

 ConstPtrConstVar = &var2; // Errore C3892 

 return 0;
}