Ik'ben al bijna twintig jaar C en C++ code aan het schrijven, maar er'is één aspect van deze talen dat ik nooit echt heb begrepen. Ik'heb natuurlijk regelmatig casts gebruikt, d.w.z.
MyClass *m = (MyClass *)ptr;
overal, maar er schijnen twee andere soorten casts te zijn, en ik'weet het verschil niet. Wat is het verschil tussen de volgende regels code?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
U zou het artikel C++ Programming/Type Casting eens moeten lezen.
Het bevat een goede beschrijving van alle verschillende cast types. Het volgende komt van de bovenstaande link:
const_cast
const_cast
(expression) De const_cast<>() wordt gebruikt voor het toevoegen/verwijderen const(ness) (of volatile-ness) van een variabele. static_cast
static_cast
(expression) De static_cast<>() wordt gebruikt om te casten tussen de integer types. 'b.v.' char->long, int->short etc. Static cast wordt ook gebruikt om pointers te casten naar verwante types, bijvoorbeeld bijvoorbeeld casten void* naar het juiste type.
dynamische_cast
Dynamic cast wordt gebruikt om pointers en referenties te converteren tijdens run-time, over het algemeen om een pointer of referentie omhoog of omlaag te casten een inheritance chain (overervingshiërarchie).
dynamic_cast
(expression) Het doeltype moet een pointer of reference type zijn, en de expressie moet evalueren naar een pointer of reference. Dynamische cast werkt alleen als het objecttype waarnaar de expressie verwijst compatibel is met het doeltype en de basisklasse ten minste één virtuele lidfunctie heeft. Zo niet, en het type expressie dat gecast wordt een pointer is, wordt NULL teruggegeven, als een dynamische cast op een reference mislukt, wordt een bad_cast exceptie gegooid. Als het niet mislukt, geeft dynamische cast een pointer of verwijzing van het doeltype naar het object waarnaar de expressie verwees.
reinterpret_cast
Reinterpret cast cast eenvoudigweg het ene type bitwise naar het andere. Elke pointer of integraal type kan gecast worden naar elk ander met reinterpret cast, engt; gemakkelijk voor misbruik. Bijvoorbeeld, met reinterpret cast kan een en gt; zou, op onveilige wijze, een integer pointer in een string pointer kunnen casten.
C-stijl casts verwarren const_cast, static_cast, en reinterpret_cast.
Ik wou dat C++ geen C-stijl casts had. C++ casts vallen goed op (zoals het hoort; casts zijn normaal een indicatie dat je iets slechts doet) en maken goed onderscheid tussen de verschillende soorten conversies die casts uitvoeren. Ze maken het ook mogelijk om functies te schrijven die er hetzelfde uitzien, bijv. boost::lexical_cast, wat erg prettig is vanuit het oogpunt van consistentie.
dynamic_cast
heeft runtime type controle en werkt alleen met referenties en pointers, terwijl static_cast
geen runtime type controle biedt. Voor volledige informatie, zie het MSDN artikel static_cast Operator.