J'utilise habituellement la coulée de type C dans C / C ++ Code. Ma question est, ajoute-t-elle le mot-clé "const" dans le type de coulée signifiant quoi que ce soit sur le résultat?
Par exemple, je peux penser à plusieurs scénarios: P>
void func4(short i) { const unsigned int j = (const unsigned int) i; // const unsigned int j = (unsigned int) i; }
3 Réponses :
Ajout du mot clé Const code> du type de coulée signifie que le résultat sera constant. Ce qui suit ne compilera pas en C ++ (en C, il n'a aucun effet):
void func3( TYPE i); // no reason to use `const` void func3(const TYPE& i); // use `const`, so as not to accidentally change `i`
L'exemple malloc code> est intéressant. Au contraire, cela est ok même en C ++:
int A = 0; int b = (const int) a; code> Je sais qu'il n'est pas sûr d'utiliser C casting C en C ++. Je soulève que cette question ne signifie que parler de la bonne utilisation de la coulée C, théoriquement. J'utilise toujours la référence constante pour minimiser les coûts de passage des arguments et éviter les pointeurs nuls. Je peux comprendre qu'il pourrait y avoir une conversion implicite lorsque l'affectation se produit. Y a-t-il un coût supplémentaire si je manque le
const code> entre parenthèses? Merci!
Coût supplémentaire en termes de compilation de temps ou ...?
Dans le premier exemple de retour non-const dans une fonction qui nécessite que const, c'est à nouveau ce qui signifie que consiste, mais vous ne pouvez pas le remarquer car si ce n'est pas là, il sera ajouté.
Dans le deuxième exemple, il s'agira d'une construction de const.
Dans le troisième exemple, il est interdit car il est inoffensif: je vais changer pour le reste de la fonction et non recouvertable.
N'oubliez pas que le type de type dans le conteneur n'est pas du type de son type, il sera automatiquement identique que celui mis dans le champ long ne restera pas int.
Vous devez également vous rappeler que le consecteur signifie à peu près la même chose que privé ou public à l'assembleur, qui n'est rien. Le code de l'assembleur généré ne différera pas du tout, peu importe où vous mettez Const et fonctionnera à la même vitesse exactionnellement. P>
Voulez-vous dire qu'il est préférable d'écrire explicitement «const» lors de la coulée pour minimiser les coûts? Pour l'argument de la fonction, comme anthony i> a mentionné, que ce soit le "const" est de la préoccupation de la mise en œuvre de la fonction, je pense donc que le "const" supplémentaire ne causera pas de problème lors de l'utilisation de bibliothèques externes. Merci!
Il n'y a rien à minimiser, la coulée ne fait rien à moins que cela n'ait été effectué. Tout le casting est fait lors de la compilation de la sécurité de type. Seuls des choses comme Int à Doubler ou Char * à STD :: La chaîne prend du temps, même la coulée dans l'héritage ne fait rien. Tout est pour la sécurité de type et ne génère pas de code d'assembleur.
Ajout Si vous ajoutez le ceci pourrait être argumenté comme un bon style --- La variable est-elle traitée comme Utilisation const code> à une distribution est comme l'ajout
const code> à tout autre spécificateur de type --- L'objet résultant est
const code>. Ce que cela signifie dépend du contexte. Si vous ajoutez
const code> au niveau supérieur (par exemple,
const int code> ou
const foo code> ou
int * const code>, alors vous Ayez juste un objet
const code>. Dans la plupart des cas, cela peut être copié et attribué, comme un objet non-
const code> peut (bien qu'il y ait quelques exceptions près, comme
std: : Auto_ptr code>).
const code> à un pointeur, vous pouvez également l'ajouter au type pointu auquel. Par exemple,
int * const code> est un
Const code> du pointer sur un
int code>, alors que
const int * code> ou
int const * code> est un pointeur ordinaire sur un
const int code>. p>
const code> au niveau supérieur dans une déclaration de paramètre est comme déclarant toute autre variable locale
const code> --- Vous ne pouvez pas modifier l'objet nommé dans le corps de la fonction. Toutefois, ce
const code> ne fait pas partie du type de fonction, de sorte que vous pouvez déclarer-déclare la fonction sans elle (avec des compilateurs conformes au moins). p>
const code> à l'intérieur de la fonction est Un détail de mise en œuvre ne devrait donc pas être dans le prototype. Dans la définition, il suit la ligne directrice de déclarer quelque chose
const code> si vous n'avez pas l'intention de le modifier. P>
const code> ailleurs dans la déclaration de paramètre (Par exemple, dans le cadre d'un pointeur) affecte le type de fonction, comme avec les moulages. p> p>
La question mentionne "C / C ++", qui est une mauvaise idée. Particulièrement ici, car alors que C et C ++ ont un mot clé
const code>, sa signification est très différente.