Considérer:
int testfunc1 (const int a)
{
return a;
}
int testfunc2 (int const a)
{
return a;
}
Ces deux fonctions sont-elles les mêmes dans tous les aspects ou y a-t-il une différence?
Je suis intéressé par une réponse pour le langage C, mais s'il y a quelque chose d'intéressant dans le langage C ++, j'aimerais aussi savoir.
Réponses:
const T
etT const
sont identiques. Avec les types de pointeur, cela devient plus compliqué:const char*
est un pointeur vers une constantechar
char const*
est un pointeur vers une constantechar
char* const
est un pointeur constant vers un (mutable)char
En d'autres termes, (1) et (2) sont identiques. La seule façon de faire le pointeur (plutôt que la pointee)
const
est d'utiliser un suffixe-const
.C'est pourquoi beaucoup de gens préfèrent toujours mettre
const
du bon côté du type (style «East const»): cela rend son emplacement par rapport au type cohérent et facile à retenir (il semble aussi anecdotique de faciliter l'enseignement aux débutants ).la source
L'astuce consiste à lire la déclaration à l'envers (de droite à gauche):
Les deux sont la même chose. Par conséquent:
L'astuce de lecture à l'envers est particulièrement utile lorsque vous avez affaire à des déclarations plus complexes telles que:
la source
char const *
, lu de gauche à droite est: "pointer, const, char". C'est un pointeur vers const char. Lorsque vous dites "un pointeur constant", l'adjectif "constant" se trouve sur le pointeur. Donc, dans ce cas, votre liste d'adjectifs aurait dû être: "const, pointer, char". Mais vous avez raison, il y a une ambiguïté dans cette astuce. C'est vraiment un "truc", plus qu'une "règle" définitive.Il n'y a pas de différence. Ils déclarent tous les deux que "a" est un entier qui ne peut pas être modifié.
L'endroit où les différences commencent à apparaître est lorsque vous utilisez des pointeurs.
Ces deux:
déclarez "a" comme étant un pointeur vers un entier qui ne change pas. "a" peut être attribué à, mais "* a" ne le peut pas.
déclare "a" comme étant un pointeur constant vers un entier. "* a" peut être attribué à, mais "a" ne le peut pas.
déclare "a" comme étant un pointeur constant vers un entier constant. Ni "a" ni "* a" ne peuvent être attribués.
la source
Prakash a raison de dire que les déclarations sont les mêmes, même si un peu plus d'explications sur la casse du pointeur pourraient être nécessaires.
"const int * p" est un pointeur vers un int qui ne permet pas de modifier l'int à travers ce pointeur. "int * const p" est un pointeur vers un int qui ne peut pas être modifié pour pointer vers un autre int.
Voir https://isocpp.org/wiki/faq/const-correctness#const-ptr-vs-ptr-const .
la source
const int
est identique àint const
, comme c'est le cas pour tous les types scalaires en C. En général, déclarer un paramètre de fonction scalaire comme celaconst
n'est pas nécessaire, car la sémantique appel par valeur de C signifie que toute modification de la variable est locale à sa fonction englobante.la source
Ce n'est pas une réponse directe mais une astuce connexe. Pour garder les choses droites, j'utilise toujours la convection "mis
const
à l'extérieur", où par "extérieur" j'entends l'extrême gauche ou l'extrême droite. De cette façon, il n'y a pas de confusion - le const s'applique à la chose la plus proche (le type ou le*
). Par exemple,la source
Ce sont les mêmes, mais en C ++, il y a une bonne raison de toujours utiliser const sur la droite. Vous serez cohérent partout car les fonctions membres const doivent être déclarées de cette façon:
Il change le
this
pointeur de la fonction deFoo * const
àFoo const * const
. Vois ici.la source
Oui, ils sont les mêmes pour juste
int
et différent pour
int*
la source
Je pense que dans ce cas, ce sont les mêmes, mais voici un exemple où l'ordre compte:
la source