note: je sais qu'il y a beaucoup de questions qui en ont parlé, mais je suis toujours débutant et je ne pouvais pas comprendre les exemples.
J'ai reçu un prototype de fonction qui va comme ceci: p>
someMemberVar = sm;
7 Réponses :
Ce n'est pas tout à fait évident de votre question et je soupçonne que le texte de l'erreur que vous donnez est en fait faux et lit en réalité:
ne peut pas convertir de
const char * code> à
char * code> p> blockQuote>
puisque vous dites que P>
Somemembervar est juste un pointeur à caractère. P> BlockQuote>
C'est logique. Gardez à l'esprit que
const char * code> est en réalité identique à celui
chartons * code> - c'est-à-dire un pointeur à un Cons-car, pas un pointeur de Const de Const! Et vous ne pouvez pas convertir un pointeur en
T const code> à un pointeur sur
t code>, car cela casse la sécurité de type. Considérez: p>
xxx pré> p>
Si vous passez un pointeur non-Const sur un fonctionnement code>, il est automatiquement converti en un pointeur Const. Donc, vous ne pouvez pas attribuer
sm code> à
somemembervar code> car cela violerait la Constitution de SM. Vous pouvez déclarer
somemembervar code> en tant que
const char * code> et votre code fonctionnerait toutefois, vous ne pouvez pas modifier ce qu'il a pointé. P>
Const Char * SM signifie que je peux passer un const ou non-const, alors pourquoi c ++ la convertit automatiquement? Cela n'a pas de sens pour moi.
"Cons-Char * SM" signifie "pointeur à const-charret". Rien d'autre. C'est ce que SM sera en quelque sorte. Vous êtes capable de passer un "char *" à une certaine pression car la conversion de non-consons à const est autorisée. L'élimination de la constance n'est pas autorisée, ce que vous essayez alors de faire lorsque vous assignez SM à SOMEMemberVAR.
À l'intérieur de la fonction, le pointeur est converti car vous voulez que ce soit const à l'intérieur de cette fonction - vous l'avez dit de cette façon. Cela fait partie du contrat que la fonction fait avec ses appelants. Si la fonction ne veut pas garantir que la mémoire pointée par SM ne change pas, ne faites pas le paramètre Const de caractères.
Const Char * SM est un pointeur à un caractère constant (ou une matrice). Lorsque vous essayez d'attribuer, somemembervar em>, un pointeur à caractère, vous essayez de le pointer sur un ensemble de caractères
const Char * code> est un pointeur à un caractère constant:
Dans votre exemple SM est Const Char * Donc, une certaine fonction a un contrat avec son appelant qu'il ne modifiera pas la mémoire que SM pointe à. p>
Mais si vous attribuez SM à Somemembervar et Somemembervar n'est pas Const Char * Vous pourrez alors modifier la mémoire que SM pointe vers Via Somemembervar et le compilateur ne vous permet pas de le faire. P>
Je vais essayer de mettre en place des termes plus simples ce que les autres disent: p>
La fonction Quelle est la différence entre: int conviennction (const Char * sm) const {...} et ceci: int convocation (const char * sm) {...} p>
blockQuote>
La première est une fonction qui prend un paramètre lisonly. Le deuxième de fonctionnement code> prend une chaîne en lecture seule (pour la simplicité, bien que
char * code> pourrait être utilisé dans les autres cas d'autres cas). Que vous transmettez une chaîne lisonnante sur
de fonctionnement code> ou non, le paramètre est traité comme en lecture seule par le code exécutant dans le contexte de cette fonction. Dans cette fonction, le compilateur essaiera donc de vous empêcher d'écrire à cette chaîne autant que possible. Un pointeur non-Const est une telle tentative de ne pas tenir compte de la balise en lecture seule à la chaîne et du compilateur, à juste titre et à haute voix vous informe de ce mépris de son système de type;) p>
const code> écrit après la fermeture des parenthèses n'est valide que pour les fonctions des membres. Cela ne prend pas seulement un paramètre en lecture seule, mais aussi des guranties pour ne pas modifier l'état de l'objet. Ceci est typiquement appelé niveau de conception const. P>
C'est très bien. Quelle est la différence entre: int conversion (const Char * sm) const {...} et ceci: int conviennent (const char * sm) {...}
int assoclication (const Char * sm) const {...} signifie ici que je ne modifierai aucune donnée ici ou que cela fait référence au paramètre?
Un moyen simple de décrire "Trailing const code>" est qu'il s'applique à
ceci code>. Dans une méthode non-const de classe
t code>, le type de
ceci code> est
t * cons code>. Dans une méthode constante de la même classe, le type de
ceci code> est
t const * const code>.
Dans un commentaire de l'une des autres réponses que vous avez dit: p>
const char * sm signifie que je peux passer un const ou non-const, alors pourquoi c ++ le convertit automatiquement? Cette n'a pas de sens pour moi. P> blockQuote>
entre votre question initiale et ce commentaire, je pense que vous êtes mal compris que le compilateur traite les types. P>
Vous êtes correct qu'un non-const
char * code> peut être jeté en toute sécurité à un
const char * code>. Cependant, votre méthode prend explicitement un
const char * code>. Ainsi, pendant que vous pouvez passer un
char * code> dans la fonction, le compilateur jette simplement automatiquement l'argument lors de l'appel de la fonction. Le code réel dans la fonction ne sait pas si l'argument initial était constitué ou non. Le compilateur doit passer par la déclaration réelle de la variable que vous utilisez, pas em> une variable précédente qui avait la même valeur. P>
Si vous voulez pouvoir traiter différemment des variables de non-const
char * code> (attribuez-les), vous devez définir une fonction qui prend non-const
char * Code> Variables. P>
Comment est exactement
somemembervar code> déclaré et quel est le message d'erreur exact que vous obtenez (celui que vous fournissez n'a aucun sens, alors je soupçonne qu'il y a une faute de frappe).
J'ai corrigé mon erreur. Il est déclaré comme ça: Char * Somemembervar;
@Alan il est surtout correct. Char * peut être lancé en toute sécurité à Cons-Char *, de sorte que vous puissiez transmettre un caractère * à cette méthode comme si vous voulez un Cons-Char *. Le compilateur va juste faire la distribution pour vous.
@Alan: Non, cela peut accepter Const Char * ou Char *. Il traitera soit comme s'il s'agissait de Const Char *. Vous avez besoin d'une extinction explicite pour modifier un datatype de const à un non-const, mais pas l'inverse. Après tout, juste parce qu'une variable peut être écrite pour ne pas dire que je dois changer sa valeur.
Bien que vous ayez besoin de comprendre ce qui se passe ici pour d'autres raisons, la solution réelle que vous souhaitiez est de faire
somemembervar code> A
std :: string code>. Surtout lorsque vous apprenez les bases de la langue, les variables qui détiennent des valeurs (comme INT, une chaîne, etc.) sont plus faciles à utiliser. Après avoir appris la langue, ils sont toujours plus faciles à utiliser (parce que vous / souhaitez / pour tenir une valeur la plus grande du temps).