Utiliser la commande static_cast en C++
-
Utilisez
static_cast
pour convertir explicitement des types d’objets en C++ -
Utilisez
reinterpret_cast
pour convertir explicitement des types d’objets 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
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