110 votes

C++ Const Utilisation De L'Explication

const int* const Method3(const int* const&) const;

Quelqu'un peut m'expliquer l'utilisation de chaque de la const?

113voto

ildjarn Points 38377

C'est plus facile à comprendre si vous réécrire ce que l'complètement équivalent

//  #1      #2                #3      #4      #5
int const * const Method3(int const * const&) const;

puis le lire de droite à gauche.

#5 dit que l'intégralité de la déclaration de la fonction vers la gauche est - const, ce qui implique que ce doit être un membre de la fonction plutôt qu'une fonction libre.

#4 dit que le pointeur vers la gauche est - const et ne peut pas être modifié pour pointer vers un emplacement différent.

#3 dit que l' int à gauche, const.

#2 dit que le pointeur vers la gauche est - const.

#1 dit que l' int à gauche, const.

Mettre tous ensemble, vous pouvez lire cela comme un const fonction membre nommée Method3 qui prend une référence à un const pointeur vers un int const (ou const int, si vous préférez) et renvoie un const pointeur vers un int const (const int).

81voto

The Mouth of a Cow Points 4058

Lire ceci: http://www.parashift.com/c++-faq-lite/const-correctness.html

La finale const signifie que la fonction Method3 ne modifie pas la non mutable membres de sa classe.

const int* const signifie un pointeur constant sur une constante de type int: c'est à dire un pointeur qui ne peut pas être changé, à un int qui ne peut pas être changé: la seule différence entre le présent et l' const int& , c'est qu'il peut être null

const int* const& signifie une référence à un pointeur constant sur une constante de type int. Habituellement, les pointeurs ne sont pas passés par référence; const int* & a plus de sens car cela voudrait dire que le pointeur peut être modifié au cours de l'appel de méthode, qui serait la seule raison que je vois pour passer un pointeur par référence, const int* const& est à toutes fins utiles, le même que const int* const , sauf que c'est probablement moins efficace que les pointeurs sont plaine des données anciennes (POD) types et ceux-ci devraient, en général, être passés par valeur.

23voto

Alexander Gessler Points 26717

Tout d'abord const T est équivalent à T const.

const int* const est donc équivalent à int const * const.

Lors de la lecture des expressions avec beaucoup d' const des jetons et les pointeurs, toujours essayer de les lire de droite à gauche (après application de la transformation ci-dessus). Donc dans ce cas la valeur de retour est un const pointeur const int. Faire le pointeur lui-même const n'a pas de sens ici, puisque la valeur de retour n'est pas une lvalue et susceptibles d'être modifiés. Faire de la pointee const, cependant, garantit que l'appelant ne peut pas modifier l' int (ou un tableau d' ints) retournés par Method3.

const int*const& devient int const*const&, donc c'est une référence à un pointeur const d'un const int. Le passage d'un pointeur const par des références mâle pas de sens, vous ne pouvez pas modifier la valeur de référence depuis le pointeur est - const et les références et les pointeurs occuper de l'égalité de stockage donc il n'y a pas tout l'espace de l'épargne.

La dernière const indique que la méthode ne modifie pas l' this objet. L' this pointeur dans le corps de la méthode aura l' (théorique) de la déclaration de T const * const this. Cela signifie qu'un const T* objet sera en mesure d'appeler T::Method3().

12voto

Yony Points 597

Un moyen facile de se rappeler les règles de const est de penser à elle de cette façon: const s'applique à la chose sur sa gauche, à moins qu'il n'y a rien sur sa gauche.

Ainsi, dans le cas d' const int * const, la première const a rien sur sa gauche, de sorte qu'il s'applique à l' int et la seconde de n'avoir quelque chose sur sa gauche, de sorte qu'il s'applique à l'aide du pointeur.

Cette règle vous indique également ce qui se passerait dans le cas où vous avez const int const *. Depuis deux const appliquer à l' int cette expression est redondant et donc invalide.

3voto

Jason Points 20479

J'aime utiliser le "horloge" ou "spirale" de la méthode où à partir de l'identificateur de nom (dans ce cas - Method3) de vous lire en retour-et-vient de gauche à droite retour à gauche, etc. afin de décoder les conventions de nommage. Donc, const int* const Method3(const int* const&) const est une méthode de classe ne change pas tout les membres de la classe (de non-nommé de la classe) et prend une constante référence à un pointeur qui pointe vers une constante int et renvoie un pointeur constant constant int.

Espérons que cela aide,

Jason

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