C
Chef-Caster schrieb:
Hallo,
ich hab mal ne Frage bezüglich des casten:
Es gibt 4 Arten des Castens:
const_cast (zum entfernen eines const)
static_cast (Casten zur Compilierzeit)
dynamic_cast (Casten zur Ausführungszeit)
reinterpreter_cast (Konvertierung zwischen nicht verwandten Typen)
Dann kann man aber auch noch:
(Typ)Object
casten.
Ist das ein static_cast falls er es zur Kompilierzeit
feststeht ansonsten ein dynamic_cast?
Gruß,
Chef-Caster
const_cast : entfernen und/oder hinzufügen von cv-qualifizierer (d.h. const oder volatile)
static_cast : cast basiserend auf dem statischen typ des operanden. die liste, der erlaubte konvertierungen ist relativ lang, als faustregle gilt, dass konvertierungen, die auch implizit durchgeführt werden, mittels static_cast möglich sind, sowie deren inverses (mit ausnahme von lvalue-zu-rvalue,array-zu-pointer,konvertierung-zu-bool und funktion-zu-pointer), und static_cast can const nicht wegcasten
dynamic_cast : casten basierend auf dem dynamischen typ des operanden, kann nur auf objekte mit virtuellen funktionen bzw. refernzen oder pointer darauf angewendet werden. damit sind up- (die gehen auch implizit oder per static_cast). down-(das geht auch mit static_cast) und cross-casts möglich.
reinterpret_cast : casts basierend auf dem statischen typ, das ergebnis ist fast immer implementation-defined (sofern überhaupt zulässig)
cast-notation (T)x
führt eine der folgenden casts durch:
- const_cast
- static_cast
- static_cast danach const_cast
- reinterpret_cast
- reinterpret_cast danach const_cast
gibt es mehrere möglichkeiten, so wird die gewählt, die weiter oben in der liste auftaucht.
functionale notation ( T(x) )
- 100% equivalent zur cast-notation (allerdings sind nur einfache typ-bezeichner zulässig, und da die meisten unsicheren casts mit referenzen oder pointern stattfinden, ist diese notation nicht ganz so kritisch, sofern man nicht mit typedef typen arbeitet)