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<mērķa tips>(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.
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.
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.