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 ?
Les seuls casts qui peuvent échouer au moment de l'exécution sont les suivants dynamic_cast
s.
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 ?
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.
Les seuls casts qui peuvent échouer au moment de l'exécution sont les suivants dynamic_cast
s.
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.
Normal C cast (int)something
ne peut pas échouer - soit vous obtenez un cast vers int, soit une erreur de compilation.
En bref :
static_cast<>()
vous donne une possibilité de vérification au moment de la compilation, alors que le C-Style cast ne le fait pas.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.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
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.
Voir les excellentes réponses fournies à ce sujet : Différents types de castings en C++
É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 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.
6 votes
En rapport : stackoverflow.com/questions/103512/