Il y a beaucoup de choses à l' const
mot-clé, il est plutôt complexe. En général, l'ajout d'un lot de const à votre programme est considéré comme une bonne pratique, la recherche sur le web pour "const correctness" et vous trouverez plein d'info à ce sujet.
Le mot-clé const est un soi-disant "type qualificatif", d'autres sont volatile
et restrict
. Au moins volatiles suit le même (confusion) règles de const.
Tout d'abord, le mot-clé const sert à deux fins. Le plus évident est de protéger les données (et les pointeurs) à partir intentionnelle ou accidentelle d'une mauvaise utilisation, en faisant d'eux en lecture seule. Toute tentative de modifier une variable const sera repéré par le compilateur au moment de la compilation.
Mais il y a aussi un autre but dans n'importe quel système avec mémoire en lecture seule, à savoir assurer une certaine variable est allouée à l'intérieur de ces la mémoire - c'est peut-être l'EEPROM ou flash par exemple. Ceux-ci sont connus en tant que non-volatile souvenirs, la mémoire non volatile. Une variable alloué dans la mémoire non volatile sera toujours, bien sûr, suivre toutes les règles d'une variable const.
Il y a différentes façons d'utiliser l' const
mot-clé:
Déclarez une constante variable.
Cela peut être fait soit en tant que
const int X=1; or
int const X=1;
Ces deux formes sont tout à fait équivalents. Celle-ci est considérée comme un mauvais style et ne doit pas être utilisé.
La raison pour laquelle la deuxième ligne est considérée comme un mauvais style, est sans doute parce que "le stockage de classe prescripteurs" comme statique et externes peuvent également être déclarés après le type réel, int static
etc. Mais le faire pour le stockage de classe prescripteurs est marqué comme obsolète par la fonction C (comité de l'ISO 9899 N1539 projet, 6.11.5). Par conséquent, par souci de cohérence, il ne faut pas écrire de type qualificatifs de cette manière. Il ne sert à rien d'autre but mais confondre le lecteur de toute façon.
Déclarer un pointeur vers une constante variable.
const int* ptr = &X;
Cela signifie que le contenu de 'X' ne peut pas être modifié. C'est la façon normale vous déclarer des pointeurs comme ce, principalement dans le cadre des paramètres de la fonction de "const correctness". Parce que " X " n'ont pas besoin d'être déclarée const, il pourrait être n'importe quelle variable. En d'autres termes, vous pouvez toujours "mise à niveau" une variable const. Techniquement, C permet également à un déclassement de la const à une simple variable explicite typecasts, mais le faire est considéré comme une mauvaise programmation et compilateurs généralement de donner des avertissements contre elle.
Déclarer un pointeur constant
int* const ptr = &X;
Cela signifie que le pointeur lui-même est constante. Vous pouvez modifier ce qu'il désigne, mais vous ne pouvez pas modifier le pointeur lui-même. Cela ne veut pas avoir de nombreuses utilisations, il y a quelques, de s'assurer qu'un pointeur à pointe-au (pointeur de pointeur) n'a pas changé d'adresse tout passé comme paramètre à une fonction. Vous aurez à écrire quelque chose de pas trop lisible comme ceci:
void func (int*const* ptrptr)
Je doute que beaucoup de programmeurs C peut obtenir la const et * le droit d'être là. Je sais que je ne peux pas, j'ai eu à le vérifier à l'aide de GCC. Je pense que c'est pourquoi il est rarement voir jamais que la syntaxe de pointeur de pointeur, même si elle est considérée comme une bonne pratique.
Constante des pointeurs peuvent aussi être utilisés pour s'assurer que le pointeur de la variable est déclarée dans la mémoire en lecture seule, par exemple, vous pourriez souhaiter pour déclarer une sorte de pointeur de base de la table de choix et de le répartir dans la mémoire non volatile.
Et bien sûr, comme indiqué par d'autres réponses, constante pointeurs peut également être utilisé pour appliquer des "const correctness".
Déclarer un pointeur constant constant de données
const int* const ptr=&X;
Ce sont les deux types de pointeur décrit ci-dessus combinés, avec tous les attributs de tous les deux.
Déclarer une lecture seule fonction membre (C++)
Puisque c'est marqué, C++, je dois aussi mentionner que vous pouvez déclarer les fonctions membres d'une classe comme const. Cela signifie que la fonction n'est pas autorisée à modifier à tout autre membre de la classe lorsqu'il est appelé, qui empêche le programmeur de la classe à partir des erreurs accidentelles, mais aussi d'informer l'appelant de la fonction de membre qu'ils ne seront pas gâcher quoi que ce soit jusqu'en l'appelant. La syntaxe est la suivante:
void MyClass::func (void) const;