C++ Cast

Da Andreabont's Wiki.

Essendo il C++ un linguaggio a tipizzazione forte, spesso è necessario effettuare l'operazione di cast al fine di trasformare una variabile di un tipo in una variabile di un'altro tipo. Questa operazione è ereditata dal C, ma viene ulteriormente espansa nel C++.

Cast C-Style

Anche il C++ permette il cast in stile C, che si esegue ponendo prima della variabile, tra parentesi, il tipo che si vuole ottenere.

double miavariabile = 2.5;
int altravariabile = (int) miavariabile;

Il C++ permette anche una sintassi alternativa, ma dal comportamento identico:

double miavariabile = 2.5;
int altravariabile = int(miavariabile);

Cast diretto

Questi cast lavorano su variabili, oggetti e puntatori, ma non funzionano sugli smart pointer.

Cast su costanti

Questo cast specifico serve a prendere delle costanti e ottenere lo stesso tipo ma non costante.

const char* testocostante = "abcdefg";
char* miotesto = const_cast<char*> (testocostante);

Cast statico

Questo è il cast più generico ed usato, non fa controlli di correttezza e permette il cast tra tipi e classi.

class Base {};
class Derivata: public Base {};
Base * a = new Base;
Derived * b = static_cast<Derivata*>(a);

Cast dinamico

Il cast dinamico accetta solo puntatori o reference, effettua controlli affinchè sia garantito un risultato completo. Effettuare il downcast con questo metodo può far fallire l'operazione.

class Base {};
class Derivata: public Base {};
Base *a = new Base;
Derived *b = dynamic_cast<Derivata*>(a);
if(b != nullptr) {
   // OK
}

Per funzionare correttamente è necessario che il programma sia compilato con il sistema RTTI (Run-Time Type Information) abilitato, in modo da conoscere anche a run-time il tipo delle variabili usate.

Cast di reinterpretazione

Questo è il cast più particolare e pericoloso, permette di trasformare un puntatore ad un tipo ad un puntatore ad un'altro tipo, reinterpretando i dati binari. Questo può provocare molti errori, va usato con cautela.

class A { /* ... */ };
class B { /* ... */ };
A *a = new A;
B *b = reinterpret_cast<B*>(a);