const char* et char const* - sont-ils les mêmes?
d'après ce que j'ai compris, const
les modificateurs doivent être lus de droite à gauche. De là, je comprends:
const char*
est un pointeur dont les éléments de char ne peuvent pas être modifiés, mais le pointeur lui-même peut, et
char const*
est un pointeur constant vers mutable
.
Mais j'obtiens les erreurs suivantes pour le code suivant:
const char* x = new char[20];
x = new char[30]; //this works, as expected
x[0] = 'a'; //gives an error as expected
char const* y = new char[20];
y = new char[20]; //this works, although the pointer should be const (right?)
y[0] = 'a'; //this doesn't although I expect it to work
So... qui est-ce? Est mon comprendre ou mon compilateur (VS 2005) faux?
6 réponses
en Fait, selon la norme, const
modifie l'élément directement à sa gauche . L'utilisation de const
au début d'une déclaration est juste une pratique mentale raccourci. Ainsi, les deux énoncés suivants sont équivalents:
char const * pointerToConstantContent1;
const char * pointerToConstantContent2;
afin d'assurer le pointeur lui-même n'est pas modifié, const
doit être placé après l'astérisque:
char * const constantPointerToMutableContent;
pour protéger À la fois le pointeur et le contenu qu'il pointe, utilisez deux consts.
char const * const constantPointerToConstantContent;
j'ai personnellement adopté toujours mettre la const après la partie, j'ai l'intention de ne pas modifier ce que j'ai de maintenir la cohérence même lorsque le pointeur est la partie que je souhaite garder constante.
ça marche parce que les deux sont identiques. Cents cinquante et une million neuf cent quarante mille neuf cent vingt"
const char* // both are same
char const*
et
char* const // unmutable pointer to "char"
et
const char* const // unmutable pointer to "const char"
[pour se rappeler ceci, voici une règle simple, ' * 'affecte son tout LHS premier ]
c'est parce que la règle est:
règle: const
se lie à gauche, sauf s'il n'y a rien à gauche, alors il se lie à droite :)
donc, regardez-les comme:
(const --->> char)*
(char <<--- const)*
pareil! oh, et --->>
et <<---
ne sont pas des opérateurs, ils montrent juste à quoi le const
se lie.
(de 2 simple variable d'initialisation question )
Une très bonne règle de base concernant les const
:
lire les déclarations de droite à gauche.
(voir Vandevoorde/Josutiss "Modèles C++: Le Guide Complet")
par exemple:
int const x; // x is a constant int
const int x; // x is an int which is const
// easy. the rule becomes really useful in the following:
int const * const p; // p is const-pointer to const-int
int const &p; // p is a reference to const-int
int * const * p; // p is a pointer to const-pointer to int.
depuis que j'ai suivi cette règle empirique, Je Je n'ai plus jamais mal interprété de telles déclarations.
(: sisab retcarahc-rep a pas des tonnes ,sisab nekot-rep a pas de tfel-ot-thgir naem je hguohT :la marée
Voici comment j'essaie toujours d'interpréter:
char *p
|_____ start from the asterisk. The above declaration is read as: "content of `p` is a `char`".
char * const p
|_____ again start from the asterisk. "content of constant (since we have the `const`
modifier in the front) `p` is a `char`".
char const *p
|_____ again start from the asterisk. "content of `p` is a constant `char`".
Espère que cela aide!
dans vos deux cas, vous pointez un char constant.
const char * x //(1) a variable pointer to a constant char
char const * x //(2) a variable pointer to a constant char
char * const x //(3) a constant pointer to a variable char
char const * const x //(4) a constant pointer to a constant char
char const * const * x //(5) a variable pointer to a constant pointer to a constant char
char const * const * const x //(6) can you guess this one?
Par défaut const
s'applique à ce qui est immédiatement à gauche, mais il pourrait s'appliquer à ce qui est immédiatement à sa droite, si il n'y a rien qui précèdent, comme dans (1).