static_cast vs cast de style C en C++ : que choisir et pourquoi ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

static_cast, cast de style C et notation fonctionnelle : bataille des titans en C++

\n\n

Bonjour, collègue programmeur ! Si tu as déjà écrit en C++, tu t'es sûrement demandé : "Pourquoi tous ces gourous insistent-ils pour utiliser static_cast<int>(x) plutôt que le bon vieux (int)x ou int(x) ? Après tout, le résultat est le même !"

\n\n

Indice : le résultat n'est pas toujours le même, et la différence peut te coûter plusieurs heures de débogage, voire la sécurité du programme. Dans cet article, nous allons analyser une question populaire de Stack Overflow (ayant recueilli des milliers de vues) et expliquer en détail pourquoi le C++ moderne (à partir de la norme C++11 et suivantes) recommande fortement d'utiliser static_cast.

\n\n

Nous ne nous contenterons pas d'énumérer les règles, mais nous les illustrerons avec des exemples concrets que vous pouvez exécuter. C'est parti !

\n\n

1. "Bruit" visuel et recherche dans le code

\n\n

Problème du cast de style C

\n\n

Imagine une ligne de code :

\n\n
int result = (int)someDoubleValue * (int)anotherDoubleValue;
\n\n

Combien y a-t-il de conversions de type ici ? Deux. Mais trouve-les du regard en une demi-seconde. Imagine maintenant que tu aies 5000 lignes de code, et que la moitié contienne de telles parenthèses. C'est un véritable enfer lors des revues de code.

\n\n

Regardons maintenant le même code avec static_cast :

\n\n
int result = static_cast<int>(someDoubleValue) * static_cast<int>(anotherDoubleValue);
\n\n

On voit immédiatement : "Ah, ici nous réduisons délibérément double en int". static_cast agit comme un commentaire documentaire. Il crie : "Je sais ce que je fais ! C'est une conversion de type intentionnelle !"

\n\n

Bonus pour grep et IDE

\n\n

Essaie de trouver tous les endroits dans le projet où un cast de style C est utilisé. Tu devras chercher simplement ) ou ( — c'est impossible. Alors que static_cast se trouve avec une seule commande grep -r "static_cast". Ton IDE les mettra en évidence, et tu pourras rapidement parcourir tous les endroits dangereux.

\n\n

2. Sécurité : le compilateur est ton ami, pas ton ennemi

\n\n

Erreur typique de débutant

\n\n

Supposons que tu veuilles convertir un pointeur vers une classe de base en un pointeur vers une classe dérivée. Le cast de style C le fera silencieusement, même si la hiérarchie de classes n'est pas liée :

\n\n
class Base { /* ... */ };\nclass Derived : public Base { /* ... */ };\nclass Unrelated { /* ... */ };\n\nBase* basePtr = new Derived;\nUnrelated* badPtr = (Unrelated*)basePtr; // Le compilateur ne dit rien !\n// Maintenant tu as un UB (comportement indéfini) en accédant à badPtr\n
\n\n

Cela s'appelle reinterpret_cast, et le cast de style C l'exécute sans avertissement. static_cast dans une telle situation générera une erreur de compilation :

\n\n
Unrelated* badPtr = static_cast<Unrelated*>(basePtr); // Erreur de compilation !\n// error: invalid static_cast from type 'Base*' to type 'Unrelated*'\n
\n\n

Le compilateur est ton bouclier. Le cast de style C, c'est comme désactiver tous les systèmes de sécurité d'une voiture et espérer ne pas avoir d'accident.

\n\n

Conversion de pointeurs vers le bas de la hiérarchie (downcast)

\n\n

Le cast de style C permet de faire un downcast sans vérification de type à l'exécution. static_cast le permet aussi, mais il vérifie au moins que les classes sont dans la même hiérarchie d'héritage. Pour un downcast sécurisé avec vérification RTTI, utilise dynamic_cast — mais c'est une autre histoire.

\n\n

3. Contrôle sur ce que tu fais

\n\n

Trois conversions différentes dans une seule parenthèse

\n\n

Le cast de style C est un couteau suisse qui peut faire trois choses différentes :

\n
    \n
  • static_cast (conversion normale entre types numériques ou vers le haut/bas dans la hiérarchie)
  • \n
  • const_cast (suppression de la constance)
  • \n
  • reinterpret_cast (réinterprétation de la représentation binaire)
  • \n
\n\n

Voici un exemple qui en choque beaucoup :

\n\n
const                

Blogs

Book Recommendations