const int* const Method3(const int* const&) const;
Quelqu'un peut m'expliquer l'utilisation de chaque de la const?
const int* const Method3(const int* const&) const;
Quelqu'un peut m'expliquer l'utilisation de chaque de la const?
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
).
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.
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' int
s) 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()
.
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.
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 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.