The C++ Compass

The C++ Compass
>FAQ<

FAQ

Home
Home

Risorse
Risorse

Utilities
Utilities

Compilatori
Compilatori

GUI Toolkits
GUI Toolkits

Libri
Libri

Download
Download

FAQ
FAQ



whoami
Who am I
[Precedente] [Indice] [Successiva]


[Varie]


Quali sono i diversi tipi di cast ?

I "nuovi cast", attualmente raccomandati (il "cast all'antica", ereditato dal C, è deprecato), sono i seguenti:
  • const_cast<tipodiarrivo>(espressione)
    mette e/o toglie "const" (e simili aggettivi, come "volatile")
  • static_cast<tipodiarrivo>(espressione)
    copre la maggior parte delle situazioni: permette di fare qualsiasi trasformazione di tipo che sia implicita, o inversa di una implicita, eccetto per quelle che cura il const_cast (tipi numerici, puntatori parenti fra loro, ecc)
  • reinterpret_cast<tipodiarrivo>(espressione)
    prende i BIT del valore dell'espressione, e, senza nessuna modifica, li interpreta come "tipo di arrivo"; l'uso meno raro è fra puntatori non parenti fra loro (char* e unsigned char* non sono parenti fra loro...)
  • dynamic_cast<tipodiarrivo>(espressione)
    si usa solo fra puntatori o reference a tipi polimorfici; verifica che l'espressione sia effettivamente del tipo desiderato, se no torna 0 (per cast tra puntatori) o dà exception (per cast tra reference)
    dynamic_cast offre una funzionalità del tutto nuova rispetto ai "vecchi cast" (è la "run-time type identification", RTTI). Gli altri, invece, sostanzialmente riducono, e suddividono in modo più preciso, quello che i "vecchi cast" potevano fare (inoltre, offrono una sintassi fatta per "saltare all'occhio", al contrario delle parentesi dei vecchi cast, e tale da rendere facile cercarle con un editor, ecc).

Un costrutto troppo potente, in un linguaggio, va evitato; per questo la potenza eccessiva dei "vecchi cast" viene "ritagliata" (e chiarificata) in tre casi distinti.

  • const_cast va dunque usato in modo esclusivo per mettere/togliere const e simili (solo, naturalmente, se risulta necessario farlo esplicitamente; spesso, ad es passando un char* a una funzione che richiede un const char*, il cast può essere lasciato implicito, "che è meglio"!).

  • static_cast copre tutti quei casi in cui il "nuovo tipo" può richiedere una rappresentazione binaria diversa da quello della espressione (float<->int, puntatori apparentati, ecc)

  • reinterpret_cast, tutti quelli in cui vogliamo che resti invece identica la rappresentazione binaria (ad esempio, se ho un "token opaco" di 32 bit, presentato come un unsigned int, e "so" che è in realtà un char*, oppure un float, oppure..., reinterpret_cast è giusto).




Ultimo aggiornamento : 03/07/2000

email webmaster@thecppcompass.org