2033 Stimmen

Regelmäßige Besetzung vs. statische Besetzung vs. dynamische Besetzung

Ich schreibe seit fast zwanzig Jahren C- und C++-Code, aber es gibt einen Aspekt dieser Sprachen, den ich nie wirklich verstanden habe. Ich habe natürlich regelmäßige Casts verwendet, d.h.

MyClass *m = (MyClass *)ptr;

überall, aber es scheint zwei andere Arten von Gipsen 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);

78 Stimmen

Ich würde den Cast im alten C-Stil nicht als "regulären Cast" in C++ bezeichnen, da er alles andere als das ist. Man sollte ihn in C++ generell nicht verwenden, vor allem nicht bei Klassen, denn es ist einfach zu einfach, damit Fehler zu machen. Seine Verwendung ist ein Zeichen für einen C-Programmierer, der zu C++ gewechselt ist, aber C++ noch nicht ganz gelernt hat.

136 Stimmen

Wie kann eine Frage mit einer Antwort ein Duplikat einer Frage ohne Antwort sein? mehr noch, diese Frage wurde früher gestellt als das "Original"

7 Stimmen

@Vladp Für den Fall, dass Sie sich immer noch fragen, oder jemand anderes dies liest und sich fragt . (Außerdem war es kein Moderator, der die Seite geschlossen hat, sondern ein Benutzer mit einer dupe-hammer )

15voto

DrPizza Punkte 17330

C-Stil casts vermischen const_cast, static_cast und reinterpret_cast.

Ich wünschte, C++ hätte keine Casts im Stil von C. In C++ fallen Casts richtig auf (was sie auch sollten; Casts sind normalerweise ein Hinweis darauf, dass man etwas Schlechtes tut), und sie unterscheiden richtig zwischen den verschiedenen Arten von Konvertierungen, 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.

13voto

Inisheer Punkte 19775

dynamic_cast verfügt über eine Typüberprüfung zur Laufzeit und arbeitet nur mit Referenzen und Zeigern, während static_cast bietet keine Typüberprüfung zur Laufzeit. Vollständige Informationen finden Sie in dem MSDN-Artikel static_cast Operator .

13voto

larsmoa Punkte 12018

dynamic_cast unterstützt nur Zeiger- und Referenztypen. Es gibt zurück NULL wenn der Cast unmöglich ist, wenn der Typ ein Zeiger ist, oder eine Ausnahme auslöst, wenn der Typ ein Referenztyp ist. Daraus folgt, dynamic_cast kann verwendet werden, um zu prüfen, ob ein Objekt von einem bestimmten Typ ist, static_cast nicht möglich (Sie erhalten dann einfach einen ungültigen Wert).

C-Style (und andere) Gussformen wurden bereits in den anderen Antworten behandelt.

1 Stimmen

" erhalten Sie einfach einen ungültigen Wert " und ein undefiniertes Verhalten. Das heißt, das Programm verhält sich falsch, auch wenn Sie den Wert nicht verwenden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X