En fait, le mot clé const, c'est une promesse faite au compilateur:
Tu lui promets de ne pas essayer de modifier ce que tu as déclaré const.
Et bien sur, il rechigne s'il se rend compte que tu... ne tiens pas ta promesse...
Ou, ainsi que l'a dit medinoc, que tu t'engages à n'accéder à l'élément "qu'en lecture seule" ...
Tu peux donc l'utiliser à plusieurs sauces:
Pour définir une valeur constante sous la forme d'un
const float pi=3.1415926;
qui reviendrait *à peu pres* au meme qu'un
à ceci près qu'il y a une vérification du type dans la première que tu n'a pas dans la seconde (si tu essaye const int pi=3.14... le compilo ne sera pas contant )
Au niveau des pointeurs, tu peux l'utiliser de deux manières:
- comme pointeur sur un objet constant
- comme pointeur constant sur un objet constant
La différence, c'est que, comme pointeur sur un objet constant, ca revient à dire "je ne promet pas que je ne ferai pas pointer le pointeur sur un autre objet (de meme type) mais je promet de ne pas modifier l'objet pointé" alors que le pointeur constant sur objet constant est la promesse, non seulement de ne pas tenter de modifier l'objet pointé, mais aussi de ne pas faire pointer le pointeur sur un autre objet.
Au niveau des références, cela signifie que tu t'engages à ne pas modifier l'objet qui est aliasé (grosso modo la meme chose que le pointeur sur objet constant... sauf que l'alias en lui meme n'est pas modifiable )
Enfin, au niveau des fonctions membres d'une classe, cela signifie que tu t'engages à ce que la fonction ne modifie pas la classe: elle peut travailler avec différents membres de la classe et avec des paramètres, mais les différentes valeurs seront identique avant et apres appel de la fonction.
En soi, on *peut* estimer que cela ne sert pas à grand chose (d'autant plus que ca ne change en rien la vitesse d'exécution)... mais c'est oublier que l'erreur est humaine... et que tu peux aussi en commettre
Il n'est pas rare, surtout sur les projets qui s'étalent sur un temps certain, que l'on oublie avoir décidé que telle ou telle valeur ne devait pas etre modifiée ou que telle ou telle fonction ne devait pas modifier les arguments passés ou les valeurs de la classe dont la fonction fait partie...
Et du coup, il *peut arriver* que reparcourrant le code, on se dise qu'il serait peut etre intéressant de provoquer tel ou tel changement de valeur...
Si tu n'a pas défini une valeur ne devant pas etre modifiée comme constante... le compilateur ne verra aucun problème lorsque tu décideras de la modifier... et là... les problèmes peuvent apparaitre dans les fonctions qui utilisent la fonction/valeur en se disant qu'elle n'est pas modifée... avec les incohérences que cela peut engendrer...
Si, par contre, tu déclares toutes les valeurs qui n'ont pas à etre modifiées comme constante, le compilateur te signalera si tu ne respecte pas tes engagements, et tu sera donc en mesure d'assurer une plus grande cohérence au fur et à mesure des changements
Partager