6
votes

C type de coulée avec "const" mot clé

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;
}


1 commentaires

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 , sa signification est très différente.


3 Réponses :


9
votes

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`


2 commentaires

L'exemple malloc est intéressant. Au contraire, cela est ok même en C ++: int A = 0; int b = (const int) a; 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 entre parenthèses? Merci!


Coût supplémentaire en termes de compilation de temps ou ...?



1
votes

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.


2 commentaires

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 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.



6
votes

Ajout const à une distribution est comme l'ajout const à tout autre spécificateur de type --- L'objet résultant est const . Ce que cela signifie dépend du contexte. Si vous ajoutez const au niveau supérieur (par exemple, const int ou const foo ou int * const , alors vous Ayez juste un objet const . Dans la plupart des cas, cela peut être copié et attribué, comme un objet non- const peut (bien qu'il y ait quelques exceptions près, comme std: : Auto_ptr ).

Si vous ajoutez le const à un pointeur, vous pouvez également l'ajouter au type pointu auquel. Par exemple, int * const est un Const du pointer sur un int , alors que const int * ou int const * est un pointeur ordinaire sur un const int . xxx

const au niveau supérieur dans une déclaration de paramètre est comme déclarant toute autre variable locale const --- Vous ne pouvez pas modifier l'objet nommé dans le corps de la fonction. Toutefois, ce const 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). xxx

ceci pourrait être argumenté comme un bon style --- La variable est-elle traitée comme const à 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 si vous n'avez pas l'intention de le modifier.

Utilisation const 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.


0 commentaires