Cast regolare vs. static_cast vs. dynamic_cast

Scrivo codice C e C++ da quasi vent'anni, ma c'è un aspetto di questi linguaggi che non ho mai veramente capito. Ovviamente ho usato i cast regolari, cioè

MyClass *m = (MyClass *)ptr;

dappertutto, ma sembra che ci siano altri due tipi di calchi, e non so la differenza. Qual è la differenza tra le seguenti linee di codice?

MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);

Dovresti guardare l'articolo Programmazione C++/Type Casting.

Contiene una buona descrizione di tutti i diversi tipi di cast. Quanto segue è tratto dal link di cui sopra:

const_cast

const_cast(espressione) Il const_cast() è usato per aggiungere/rimuovere const(ness) (o volatile-ness) di una variabile.

static_cast

static_cast(espressione) Lo static_cast() è usato per fare il cast tra i tipi interi. 'es. ' char->long, int->short etc.

Il cast statico è anche usato per lanciare i puntatori a tipi correlati, per esempio il casting di void* al tipo appropriato.

dynamic_cast

Il cast dinamico è usato per convertire puntatori e riferimenti a run-time, generalmente allo scopo di lanciare un puntatore o un riferimento su o giù una catena di eredità (gerarchia di eredità).

dynamic_cast(espressione)

Il tipo di destinazione deve essere un puntatore o un tipo di riferimento, e l espressione deve valutare un puntatore o un riferimento. Il cast dinamico funziona solo quando il tipo di oggetto a cui l'espressione si riferisce è compatibile con il tipo di destinazione e la classe base ha almeno una funzione membro virtuale. In caso contrario, e il tipo di espressione che viene castato è un puntatore, viene restituito NULL, se un cast dinamico su un riferimento fallisce, viene lanciata un'eccezione bad_cast. Quando non fallisce, il dynamic cast restituisce un puntatore o un riferimento del tipo di destinazione all'oggetto a cui l'espressione faceva riferimento.

reinterpretare_cast

Reinterpreta il cast semplicemente cast di un tipo bitwise ad un altro. Qualsiasi puntatore o tipo integrale può essere castato in qualsiasi altro con reinterpretare cast, permettendo facilmente un uso improprio. Per esempio, con reinterpretare il cast uno potrebbe, in modo non sicuro, lanciare un puntatore intero ad un puntatore a stringa.

Commentari (0)

I cast in stile C confondono const_cast, static_cast e reinterpret_cast.

Vorrei che il C++ non avesse i cast in stile C. I cast del C++ si distinguono correttamente (come dovrebbero; i cast sono normalmente indicativi di fare qualcosa di brutto) e distinguono correttamente tra i diversi tipi di conversione che i cast eseguono. Permettono anche di scrivere funzioni dall'aspetto simile, ad esempio boost::lexical_cast, il che è molto bello dal punto di vista della coerenza.

Commentari (0)

dynamic_cast ha un controllo di tipo runtime e funziona solo con riferimenti e puntatori, mentre static_cast non offre un controllo di tipo runtime. Per informazioni complete, vedi l'articolo MSDN static_cast Operator.

Commentari (0)