Il est possible en C++ de définir des données constantes. Ces données ne peuvent être modifiées.
Il sagit généralement de valeurs universelles :
const double Pi = 3.141592;
Il est conventionnel en C++ (quoique non obligatoire) décrire les constantes en majuscules (PI) ou en commençant par une majuscule (Pi). Rappelons que le langage différencie les majuscules des minuscules dans les identificateurs, de sorte que PI, Pi, et pi sont trois identificateurs distincts.
Toute tentative décriture se soldera par un refus très net du compilateur :
Pi += 1; // refusé !!
donnera le message Error : Lvalue required (car une constante nest pas une lvalue) ; dans dautres cas, on obtiendrait plus clairement Error : Cannot modify a const object, on ne peut pas modifier un objet constant.
Si lon tente dutiliser des pointeurs :
double *dp = Π
on obtient Error : Cannot initialize 'double near*' with 'const double near*'. Il faut en effet écrire :
const double *dp = Π
ou de manière équivalente :
double const *dp = Π
Cette déclaration signifie que *dp
est constant. En conséquence, toute occurrence de *dp
dans le programme est remplacée par la constante, même si lon modifie dp
. En effet, le pointeur lui-même nest pas constant, on peut lincrémenter :
dp++; double z = *dp;
dans ce cas, z prend la valeur de Pi, comme si dp navait pas été modifié ; surprenant, non ?
Quant aux références, on peut parfaitement les utiliser :
double &d = Pi; // valable d++; // ok, d == 4.14 maintenant
En fait, on a initialisé la référence sur une constante, ce qui provoque la création dune variable provisoire, comme on la expliqué au chapitre précédent.
La variable Pi est donc tout à fait blindée, il est réellement impossible de la changer ; et pour cause : elle nexiste pas ! Aucune place en mémoire nest allouée à Pi, de sorte quil nest pas possible de prendre son adresse (ni même den connaître la valeur en cours de débogage). La valeur réelle est simplement substituée à lécriture Pi, ainsi quà dp, dans tout le programme, ce qui constitue un raccourci pratique.
On peut parfaitement définir des tableaux constants :
const int table[3] = { 1, 2, 3 };
et des pointeurs constants (ne pas confondre avec les pointeurs sur des constantes) :
double *const dc = &d;
Dans ce cas, lopération ++dc
par exemple est interdite, puisquil sagit dun pointeur constant. Par contre, on peut écrire :
(*dc)++; // équivaut à d++;
On ne peut donc pas initialiser dc avec &Pi
.
Il existe aussi des pointeurs constants pointant sur des constantes :
const double *const dcc = Π
Dans ce cas, on ne peut modifier ni dcc ni *dcc
.
Précédent | Sommaire | Suivant |