1590 votes

quelle est la différence entre const int*, const int * const, int const *

Je ne sais jamais comment l'utiliser correctement. Existe-t-il un ensemble de règles définissant ce que vous pouvez et ne pouvez pas faire ?

Je veux connaître toutes les choses à faire et à ne pas faire en termes d'affectations, de passage aux fonctions, etc.

22voto

T.E.D. Points 26829

Cette question montre précisément pourquoi j'aime faire les choses de la façon dont je l'ai mentionné dans ma question est-ce que const après l'id du type est acceptable ?

En bref, je trouve que la façon la plus simple de se souvenir de la règle est que le "const" va après la chose à laquelle il s'applique. Ainsi, dans votre question, "int const *" signifie que l'int est constant, tandis que "int * const" signifierait que le pointeur est constant.

Si quelqu'un décide de le mettre au tout début (par exemple : "const int *"), il s'agit d'une exception spéciale qui s'applique dans ce cas à la chose qui suit.

Beaucoup de gens aiment utiliser cette exception parce qu'ils pensent que c'est plus joli. Je ne l'aime pas, car il s'agit d'une exception, et donc d'une confusion.

19voto

ufukgun Points 2426

Utilisation simple du mot "const".

L'utilisation la plus simple consiste à déclarer une constante nommée. Pour ce faire, on déclare une constante comme s'il s'agissait d'une variable, mais on ajoute "const" devant. Il faut l'initialiser immédiatement dans le constructeur car, bien entendu, on ne peut pas lui donner une valeur ultérieurement car cela reviendrait à la modifier. Par exemple,

const int Constant1=96;

créera une constante entière, appelée de manière inimaginable "Constant1", avec la valeur 96.

Ces constantes sont utiles pour les paramètres qui sont utilisés dans le programme mais qui n'ont pas besoin d'être modifiés après la compilation du programme. Elle présente un avantage pour les programmeurs par rapport à la commande '#define' du préprocesseur C, dans la mesure où elle est comprise et utilisée par le compilateur lui-même, et pas seulement substituée dans le texte du programme par le préprocesseur avant d'atteindre le compilateur principal, de sorte que les messages d'erreur sont beaucoup plus utiles.

Elle fonctionne également avec les pointeurs, mais il faut faire attention à l'endroit où 'const' détermine si le pointeur ou ce qu'il pointe est constant ou les deux. Par exemple,

const int * Constant2

déclare que Constant2 est un pointeur de variable vers un nombre entier constant et que

int const * Constant2

est une syntaxe alternative qui fait la même chose, alors que

int * const Constant3

déclare que Constant3 est un pointeur constant vers une variable entière et que

int const * const Constant4

déclare que Constant4 est un pointeur constant vers un entier constant. En fait, "const" s'applique à tout ce qui se trouve à sa gauche immédiate (sauf s'il n'y a rien à cet endroit, auquel cas il s'applique à ce qui se trouve à sa droite immédiate).

réf : http://duramecho.com/ComputerInformation/WhyHowCppConst.html

6voto

Jeff Burdges Points 1973

Il existe de nombreux autres points subtils concernant la correction des constantes en C++. Je suppose que la question ici portait simplement sur le C, mais je vais donner quelques exemples connexes puisque l'étiquette est C++ :

  • Vous passez souvent de gros arguments comme des chaînes de caractères en tant que TYPE const & qui empêche l'objet d'être modifié ou copié. Exemple :

    TYPE& TYPE::operator=(const TYPE &rhs) { ... return *this; }

    Mais TYPE & const n'a pas de sens car les références sont toujours constantes.

  • Vous devez toujours étiqueter les méthodes de classe qui ne modifient pas la classe en tant que const sinon vous ne pouvez pas appeler la méthode à partir d'un TYPE const & référence. Exemple :

    bool TYPE::operator==(const TYPE &rhs) const { ... }

  • Il existe des situations courantes où la valeur de retour et la méthode doivent être constantes. Exemple :

    const TYPE TYPE::operator+(const TYPE &rhs) const { ... }

    En fait, les méthodes const ne doivent pas retourner les données internes de la classe comme référence à un non-const.

  • Par conséquent, il faut souvent créer à la fois une méthode const et une méthode non const en utilisant la surcharge const. Par exemple, si vous définissez T const& operator[] (unsigned i) const; alors vous voudrez probablement aussi la version non-const donnée par :

    inline T& operator[] (unsigned i) { return const_cast<char&>( static_cast<const TYPE&>(*this)[](i) ); }

À ce jour, il n'existe pas de fonctions const en C, les fonctions non membres ne peuvent pas être const en C++, les méthodes const peuvent avoir des effets secondaires et le compilateur ne peut pas utiliser les fonctions const pour éviter les appels de fonction en double. En fait, même un simple int const & La référence peut voir la valeur à laquelle elle se réfère être modifiée ailleurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X