Usa il comando static_cast in C++

Jinku Hu 12 ottobre 2023
  1. Usa static_cast per convertire esplicitamente tipi di oggetti in C++
  2. Usa reinterpret_cast per convertire esplicitamente tipi di oggetti in C++
Usa il comando static_cast 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
Autore: 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

Articolo correlato - C++ Cast