Usa il comando static_cast in C++
- 
          
            Usa static_castper convertire esplicitamente tipi di oggetti in C++
- 
          
            Usa reinterpret_castper 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