Usa il comando static_cast in C++
-
Usa
static_cast
per convertire esplicitamente tipi di oggetti in C++ -
Usa
reinterpret_cast
per convertire esplicitamente tipi di oggetti in C++
Questo articolo dimostrerà più metodi su come usare static_cast
in C++.
Usa static_cast
per convertire esplicitamente tipi di oggetti in C++
Un’operazione che converte un oggetto in un tipo diverso si chiama casting
. Ci sono casi in cui si verificano conversioni implicite in C++ secondo le regole del linguaggio, ad esempio il decadimento da array a puntatore. Tuttavia, il casting è principalmente associato alla richiesta di conversione esplicita che l’utente fa. Quando trasmettiamo un valore dell’oggetto o dell’espressione a un tipo diverso, forziamo il compilatore ad associare il tipo dato al puntatore che punta all’oggetto.
Esistono quattro operazioni di cast esplicite denominate: const_cast
, static_cast
, reinterpret_cast
e dynamic_cast
. Queste operazioni sono native del linguaggio C++ moderno e sono relativamente leggibili rispetto ai vecchi cast in stile C. I cast sono spesso pericolosi e anche i programmatori esperti commettono errori con essi, ma non dovresti scoraggiarti dall’utilizzare queste operazioni di conversione quando necessario. In questo articolo, esaminiamo solo le operazioni static_cast
e reinterpret_cast
.
La funzione static_cast
viene generalmente utilizzata per convertire tipi correlati come puntatori della stessa gerarchia di classi o tipi numerici tra loro. Questo comando gestisce anche le conversioni definite da costruttori e operatori di conversione. Nota che la seconda riga nella funzione main
sta essenzialmente eseguendo il cast implicito dal char
con segno a un intero con segno, che è solo una parte della versione oscurata della riga successiva.
È il modo consigliato per eseguire il casting in C++ contemporaneo, anche se il risultato è lo stesso. D’altra parte, la quarta e la quinta riga della funzione main
non sono conversioni valide utilizzando l’operazione static_cast
. Tuttavia, possiamo forzare quest’ultima conversione usando il cast in stile C, (int*)x
, che stampa il valore intero 97
con forma esadecimale e notazione dell’indirizzo di memoria. Nota che questa operazione molto probabilmente genererà un avviso del compilatore.
#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;
}
Produzione:
a 97 97 0x61 0x7ffeb7c31997
Usa reinterpret_cast
per convertire esplicitamente tipi di oggetti in C++
In alternativa, quest’ultimo cast in stile C può essere eseguito utilizzando l’operazione reinterpret_cast
mostrata nell’esempio di codice seguente. Questo metodo silenzia l’avviso del compilatore e l’utente può assumersi la responsabilità della conversione. Possiamo convertire diversi tipi di puntatore usando il reinterpret_cast
come char*
in int*
.
In questo caso, l’indirizzo stampato è lo stesso in cui è memorizzato il carattere x
. Ricorda che se dereferenziamo il puntatore x_iii
per accedere al valore, non otterremo il carattere a
o la sua alternativa ASCII, ma piuttosto uno strano numero intero. Questo intero viene recuperato dalla stessa posizione. Solo la dimensione del tipo di dati è diversa poiché è interpretata come 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;
}
Produzione:
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