Ich schreibe seit fast zwanzig Jahren C und C++ Code, aber es gibt einen Aspekt dieser Sprachen, den ich nie wirklich verstanden habe. I've natürlich verwendet regelmäßige Casts dh.
MyClass *m = (MyClass *)ptr;
überall verwendet, aber es scheint zwei andere Arten von Casts zu geben, und ich kenne den Unterschied nicht. Was ist der Unterschied zwischen den folgenden Codezeilen?
MyClass *m = (MyClass *)ptr;
MyClass *m = static_cast<MyClass *>(ptr);
MyClass *m = dynamic_cast<MyClass *>(ptr);
Sie sollten sich den Artikel C++ Programming/Type Casting ansehen.
Er enthält eine gute Beschreibung aller verschiedenen Cast-Typen. Das Folgende stammt aus dem obigen Link:
const_cast
const_cast
(expression) Der const_cast<>() wird verwendet, um die const(ness) (oder volatile-ness) einer Variablen. static_cast
static_cast
(expression) Das static_cast<>() wird zum Casting zwischen den ganzzahligen Typen. 'z.B.' char->long, int->short usw. Static cast wird auch verwendet, um Zeiger auf verwandte Typen zu casten, zum zum Beispiel casting void* auf den entsprechenden Typ.
dynamic_cast
Dynamischer Cast wird verwendet, um Zeiger und Referenzen zur Laufzeit zu konvertieren, im Allgemeinen für den Zweck des Castings eines Zeigers oder einer Referenz nach oben oder unten einer Vererbungskette (Vererbungshierarchie).
dynamic_cast
(Ausdruck) Der Zieltyp muss ein Zeiger- oder Referenztyp sein, und der Ausdruck muss zu einem Zeiger oder einer Referenz ausgewertet werden. Dynamische Besetzung funktioniert nur, wenn der Typ des Objekts, auf das der Ausdruck verweist, mit dem kompatibel mit dem Zieltyp ist und die Basisklasse über mindestens eine virtuelle Mitgliedsfunktion hat. Ist dies nicht der Fall und der Typ des Ausdrucks, der gecastet wird ein Zeiger ist, wird NULL zurückgegeben, wenn ein dynamischer Cast auf eine Referenz fehlschlägt, wird eine bad_cast-Ausnahme ausgelöst. Wenn es nicht scheitert, gibt dynamic'cast cast einen Zeiger oder eine Referenz des Zieltyps auf das Objekt zurück auf das der Ausdruck verwiesen hat.
reinterpret_cast
Reinterpret cast überträgt einfach einen Typ bitweise auf einen anderen. Jeder Zeiger oder ganzzahliger Typ kann mit reinterpret_cast in jeden anderen gecastet werden, leicht zu missbrauchen. Mit reinterpret cast kann man zum Beispiel auf unsichere Weise einen Integer-Zeiger in einen String-Zeiger umwandeln.
C-Stil casts verwechseln const_cast, static_cast und reinterpret_cast.
Ich wünschte, es gäbe in C++ keine Casts im C-Stil. C++-Casts sind gut erkennbar (was sie auch sein sollten; Casts sind normalerweise ein Hinweis darauf, dass man etwas Schlechtes tut) und unterscheiden gut zwischen den verschiedenen Arten von Umwandlungen, die Casts durchführen. Sie erlauben es auch, ähnlich aussehende Funktionen zu schreiben, z.B. boost::lexical_cast, was aus Sicht der Konsistenz ganz nett ist.
dynamic_cast
hat eine Laufzeit-Typüberprüfung und funktioniert nur mit Referenzen und Zeigern, während static_cast
keine Laufzeit-Typüberprüfung bietet. Vollständige Informationen finden Sie im MSDN-Artikel static_cast Operator.