Utiliser la commande static_cast en C++

Jinku Hu 12 octobre 2023
  1. Utilisez static_cast pour convertir explicitement des types d’objets en C++
  2. Utilisez reinterpret_cast pour convertir explicitement des types d’objets en C++
Utiliser la commande static_cast en C++

Cet article présentera plusieurs méthodes sur l’utilisation de static_cast en C++.

Utilisez static_cast pour convertir explicitement des types d’objets en C++

Une opération qui convertit un objet en un type différent est appelée casting. Il y a des cas où des conversions implicites se produisent en C++ selon les règles du langage, par exemple, la décomposition du tableau en pointeur. Pourtant, le casting est principalement associé à la demande de conversion explicite que l’utilisateur fait. Lorsque nous convertissons une valeur de l’objet ou de l’expression dans un type différent, nous forçons le compilateur à associer le type donné au pointeur qui pointe vers l’objet.

Il existe quatre opérations de cast explicites nommées : const_cast, static_cast, reinterpret_cast et dynamic_cast. Ces opérations sont natives du langage C++ moderne et sont relativement lisibles que les anciennes conversions de style C. Les transtypages sont souvent dangereux, et même les programmeurs expérimentés commettent des erreurs avec eux, mais vous ne devriez pas être découragé d’utiliser ces opérations de conversion si nécessaire. Dans cet article, nous ne présentons que les opérations static_cast et reinterpret_cast.

La fonction static_cast est généralement utilisée pour convertir des types liés en tant que pointeurs de la même hiérarchie de classes ou de types numériques entre eux. Cette commande gère également les conversions définies par les constructeurs et les opérateurs de conversion. Notez que la deuxième ligne de la fonction main effectue essentiellement le transtypage implicite du char signé en un entier signé, qui n’est qu’un peu la version obscurcie de la ligne suivante.

C’est la méthode recommandée pour effectuer le casting en C++ contemporain, même si le résultat est le même. Par contre, les quatrième et cinquième lignes de la fonction main ne sont pas des conversions valides utilisant l’opération static_cast. Cependant, nous pouvons forcer cette dernière conversion en utilisant le cast de style C, (int*)x, qui imprime la valeur entière 97 avec une forme hexadécimale et une notation d’adresse mémoire. Notez que cette opération générera très probablement un avertissement du compilateur.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char x = 'a';
  int x_i = x;
  int x_ii = static_cast<int>(x);
  int* x_iii = static_cast<int*>(x);   // ERROR
  int* x_iii = static_cast<int*>(&x);  // ERROR
  int* x_iii = (int*)x;                // WARNING

  cout << x << endl;
  cout << x_i << endl;
  cout << x_ii << endl;
  cout << x_iii << endl;

  return EXIT_SUCCESS;
}

Production:

a 97 97 0x61 0x7ffeb7c31997

Utilisez reinterpret_cast pour convertir explicitement des types d’objets en C++

Alternativement, ce dernier transtypage de style C peut être effectué à l’aide de l’opération reinterpret_cast illustrée dans l’exemple de code suivant. Cette méthode fera taire l’avertissement du compilateur et l’utilisateur pourra assumer la responsabilité de la conversion. Nous pouvons convertir différents types de pointeurs en utilisant le reinterpret_cast comme char* en int*.

Dans ce cas, l’adresse imprimée est la même que celle où le caractère x est stocké. Rappelez-vous que si on déréférence le pointeur x_iii pour accéder à la valeur, on n’obtiendra pas le caractère a ou son alternative ASCII, mais plutôt un entier étrange. Cet entier est récupéré au même endroit. Seule la taille du type de données est différente puisqu’elle est interprétée comme le int.

#include <iostream>

using std::cout;
using std::endl;

int main() {
  char x = 'a';
  int* x_i = (int*)x;  // WARNING
  int* x_ii = reinterpret_cast<int*>(x);
  int* x_iii = reinterpret_cast<int*>(&x);

  cout << x_i << endl;
  cout << x_ii << endl;
  cout << x_iii << endl;

  return EXIT_SUCCESS;
}

Production:

0x61 0x61 0x7ffca18be95f
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Cast