Parastais cast vs. static_cast vs. dynamic_cast

Esmu rakstījis C un C++ kodu jau gandrīz divdesmit gadus, bet ir viens šo valodu aspekts, ko es nekad neesmu īsti sapratis. Es, protams, esmu izmantojis parasto casts, t.i.

MyClass *m = (MyClass *)ptr;

visur, bet šķiet, ka ir vēl divi citi casts veidi, un es nezinu, kāda ir atšķirība. Kāda ir atšķirība starp šādām koda rindiņām?

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

Jums vajadzētu apskatīt rakstu C++ Programming/Type Casting.

Tajā ir labi aprakstīti visi dažādie cast tipi. No iepriekš minētās saites ņemts šāds teksts:

const_cast

const_cast(izteiksme) const_cast() tiek izmantots, lai pievienotu/atņemtu const(ness) (vai volatile-ness) mainīgajam.

static_cast

static_cast(izteiksme) Static_cast() tiek izmantots, lai pārnestu starp veselu skaitļu tipiem. 'piem. ' char->long, int->short utt.

Statisko cast lieto arī, lai castētu rādītājus uz saistītiem tipiem, piem. piemēram, void* uz atbilstošo tipu.

dynamic_cast

Dinamisko cast lieto, lai konvertētu rādītājus un atsauces izpildes laikā, parasti, lai palielinātu vai samazinātu rādītāja vai atsauces vērtību. mantošanas ķēdē (mantošanas hierarhijā).

dynamic_cast(izteiksme)

Mērķa tipam jābūt rādītāja vai atsauces tipam, un izteiksmei jānovērtē kā rādītājam vai atsaucei. Dinamiskā pārnešana darbojas tikai tad, ja objekta tips, uz kuru attiecas izteiksme, ir saderīgs ar mērķa tipu un bāzes klasei ir vismaz viens tips. virtuālā locekļa funkcija. Ja tas tā nav un ja atveidojamās izteiksmes tips ir ir rādītājs, tiek atgriezta NULL, ja dinamiskā castēšana uz atsauci neizdodas, tiek izmests bad_cast izņēmums. Ja tas neizdodas, dinamiskais cast atgriež mērķa tipa rādītāju vai atsauci uz objektu. uz kuru izteiksme atsaucās.

reinterpret_cast

Reinterpret cast vienkārši atveido vienu tipu pēc bitu likmju principa uz citu. Jebkurš rādītājs vai integrālo tipu var pārtulkot uz jebkuru citu ar reinterpret cast, viegli pieļaujot ļaunprātīgu izmantošanu. Piemēram, ar reinterpret cast var nedroši atveidot veselu skaitļu rādītāju uz virknes rādītāju.

Komentāri (0)

C stila casts apvieno const_cast, static_cast un reinterpret_cast.

Es vēlos, lai C++ nebūtu C stila castu. C++ casts izceļas pareizi (kā tam arī vajadzētu būt; casts parasti norāda uz kaut ko sliktu) un pareizi nošķir dažādus pārveidošanas veidus, ko veic casts. Tās arī ļauj rakstīt līdzīgi izskatošas funkcijas, piemēram, boost::lexical_cast, kas ir diezgan jauki no konsekvences viedokļa.

Komentāri (0)

dynamic_cast ir darbības laika tipa pārbaude un darbojas tikai ar atsaucēm un rādītājiem, savukārt static_cast nepiedāvā darbības laika tipa pārbaudi. Pilnīgu informāciju skatiet MSDN rakstā static_cast Operator.

Komentāri (0)