244 votes

Quelle est la différence entre static_cast<> et le casting de style C ?

Y a-t-il une raison de préférer static_cast<> sur un casting de style C ? Sont-ils équivalents ? Y a-t-il une différence de vitesse ?

6 votes

255voto

Glen Points 13521

Les casts en style C++ sont vérifiés par le compilateur. Les casts de style C ne le sont pas et peuvent échouer au moment de l'exécution.

De plus, les cas de style c++ peuvent être recherchés facilement, alors qu'il est vraiment difficile de rechercher des cas de style c.

Un autre grand avantage est que les 4 casts de style C++ différents expriment plus clairement l'intention du programmeur.

Lorsque j'écris du C++, j'utilise presque toujours ceux du C++ au lieu du style C.

76 votes

Les seuls casts qui peuvent échouer au moment de l'exécution sont les suivants dynamic_cast s.

15 votes

C++ reinterpret_cast<T>(U) peut échouer au moment de l'exécution à peu près de la même façon que les casts de style C, et ils sont tous très différents de la façon dont dynamic_cast<T>(U) échoue.

25 votes

Normal C cast (int)something ne peut pas échouer - soit vous obtenez un cast vers int, soit une erreur de compilation.

204voto

Hossein Points 1789

En bref :

  1. static_cast<>() vous donne une possibilité de vérification au moment de la compilation, alors que le C-Style cast ne le fait pas.
  2. static_cast<>() est plus lisible et peut être repéré facilement n'importe où dans un code source C++, C_Style cast ne l'est pas.
  3. Les intentions sont bien mieux transmises en utilisant les casts C++.

Plus d'explications :

Le cast statique effectue des conversions entre types compatibles . Il est similaire au cast de style C, mais est plus restrictif. Par exemple, le cast de style C permettrait à un pointeur d'entier de pointer vers un char.

char c = 10;       // 1 byte
int *p = (int*)&c; // 4 bytes

Comme il en résulte un pointeur de 4 octets (un pointeur vers un type de données de 4 octets) pointant vers 1 octet de mémoire allouée, écrire sur ce pointeur provoquera une erreur d'exécution ou écrasera de la mémoire adjacente.

*p = 5; // run-time error: stack corruption

Contrairement au cast de style C, le cast statique permet au compilateur de vérifier que les types de données du pointeur et du pointeur sont compatibles, ce qui permet au programmeur de détecter cette affectation incorrecte du pointeur pendant la compilation.

int *q = static_cast<int*>(&c); // compile-time error

Vous pouvez également consulter cette page pour plus d'explications sur les coulées C++ : Cliquez ici

25 votes

Je pense qu'au lieu de "pointeur sur 4 octets", vous vouliez dire "pointeur sur un type de données sur 4 octets".

0 votes

Mais il permet int q = static_cast<int>(c) ;

5 votes

@TonyParker C'est parce qu'il n'y a rien de mal avec cette ligne.

15voto

Eugene Yokota Points 43213

Voir Comparaison des opérateurs de moulage C++ .

Cependant, l'utilisation de la même syntaxe pour une variété d'opérations de moulage différentes peut rendre l'intention du programmeur peu claire.

En outre, il peut être difficile de trouver un type de distribution spécifique dans une vaste base de code.

la généralité du cast de style C peut s'avérer excessive dans les situations où une simple conversion suffit. La possibilité de choisir entre plusieurs opérateurs de casting différents, avec des degrés de puissance différents, peut empêcher les programmeurs d'effectuer par inadvertance un casting vers un type incorrect.

5voto

Ponting Points 586

Voir les excellentes réponses fournies à ce sujet : Différents types de castings en C++

3voto

Doug T. Points 33360

Étant donné qu'il existe de nombreux types de cast, chacun ayant une sémantique différente, static_cast<> vous permet de dire "Je fais une conversion légale d'un type à un autre", comme de int à double. Un simple casting de style C peut signifier beaucoup de choses. Effectuez-vous un casting ascendant ou descendant ? Réinterprétez-vous un pointeur ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X