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 au casting de style C? Sont-ils équivalents? Est-ce une différence de vitesse?

Les moulages de style C ++ sont vérifiés par le compilateur. Les fontes de style C ne sont pas et peuvent échouer à l’exécution

de plus, les fontes de style c ++ peuvent être recherchées facilement, alors qu’il est très difficile de rechercher des modèles de style c

Un autre gros avantage est que les 4 modèles de style C ++ différents expriment plus clairement l’intention du programmeur.

En écrivant C ++, j’utiliserais presque toujours ceux en C ++ par rapport au style C.

En bref :

  1. static_cast<>() vous donne une capacité de vérification du temps de compilation, contrairement à la dissortingbution C-Style.
  2. static_cast<>() est plus lisible et peut être facilement repéré n’importe où dans un code source C ++, la dissortingbution C_Style est donc pas.
  3. Les intentions sont beaucoup mieux véhiculées en utilisant les castes C ++.

Plus d’explication :

La dissortingbution statique effectue des conversions entre les types compatibles . Il est similaire à la dissortingbution de style C, mais est plus ressortingctif. Par exemple, la dissortingbution de style C permettrait à un pointeur entier de pointer vers un caractère.

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

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

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

Contrairement à la dissortingbution de style C, la dissortingbution statique permettra au compilateur de vérifier que les types de données pointeur et pointeur sont compatibles, ce qui permet au programmeur de détecter cette mauvaise affectation de pointeur lors de la compilation.

 int *q = static_cast(&c); // comstack-time error 

Vous pouvez également consulter cette page pour plus d’explications sur les castings C ++: Cliquez ici

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

Cependant, l’utilisation de la même syntaxe pour différentes opérations de diffusion peut rendre l’intention du programmeur peu claire.

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

la généralité de la dissortingbution de style C peut être exagérée pour les situations où une simple conversion est nécessaire. La possibilité de choisir entre plusieurs opérateurs de casting de différents degrés de puissance peut empêcher les programmeurs de lancer par inadvertance un type incorrect.

 struct A {}; struct B : A {}; struct C {}; int main() { A* a = new A; int i = 10; a = (A*) (&i); // NO ERROR! FAIL! //a = static_cast(&i); ERROR! SMART! A* b = new B; B* b2 = static_cast(b); // NO ERROR! SMART! C* c = (C*)(b); // NO ERROR! FAIL! //C* c = static_cast(b); ERROR! SMART! } 

static_cast vérifie au moment de la compilation que la conversion ne se fait pas entre des types évidemment incompatibles. Contrairement à dynamic_cast , aucune vérification de la compatibilité des types n’est effectuée au moment de l’exécution. En outre, la conversion static_cast n’est pas nécessairement sûre.

static_cast est utilisé pour convertir du pointeur en classe de base en pointeur vers la classe dérivée, ou entre les types natifs, tels que enum to int ou float to int.

L’utilisateur de static_cast doit s’assurer que la conversion est sûre.

La dissortingbution C-style n’effectue aucune vérification, que ce soit à la compilation ou à l’exécution.

Comme il y a beaucoup de types différents de transtypage chacun avec une sémantique différente, static_cast <> vous permet de dire “Je fais une conversion légale d’un type à un autre”, comme de l’int ou du double. Un plâtre de style C peut signifier beaucoup de choses. Êtes-vous casting haut / bas? Est-ce que vous réinterprétez un pointeur?

Un excellent article expliquant les différents casts en C / C ++, et ce que le casting de C-style fait vraiment: https://anteru.net/blog/2007/12/18/200/index.html

C-Style casting, en utilisant la syntaxe de la variable (type). Le pire jamais inventé. Cela tente de faire les conversions suivantes, dans cet ordre: (voir aussi Standard C ++, 5.4 expr.cast paragraphe 5)

  1. const_cast
  2. static_cast
  3. static_cast suivi de const_cast
  4. reinterpret_cast
  5. reinterpret_castfollow par const_cast