834 Stimmen

Warum static_cast<int>(x) anstelle von (int)x verwenden?

Ich habe gehört, dass die static_cast Funktion sollte dem Casting im Stil von C oder einfachen Funktionen vorgezogen werden. Stimmt das? Und warum?

46 Stimmen

Einspruch, Euer Ehren, gefragt und beantwortet .

35 Stimmen

Ich stimme nicht zu, diese andere Frage war über die Beschreibung der Unterschiede zwischen casts in C++ eingeführt. Diese Frage ist über die wirkliche Nützlichkeit von static_cast, die etwas anders ist.

2 Stimmen

Wir könnten die beiden Fragen sicherlich zusammenführen, aber was wir in diesem Thread beibehalten müssten, ist der Vorteil der Verwendung von Funktionen gegenüber dem Casting im C-Stil, der derzeit nur in einer einzeiligen Antwort im anderen Thread erwähnt wird, ohne dass darüber abgestimmt wurde.

8voto

JohnMcG Punkte 8423
  1. Ermöglicht ein einfaches Auffinden von Abdrücken in Ihrem Code mit grep oder ähnlichen Werkzeuge.
  2. Macht deutlich, welche Art von Sie einen Cast durchführen und die Hilfe des die Hilfe des Compilers bei der Durchsetzung. Wenn Sie nur die const-ness, dann können Sie const_cast verwenden, was Ihnen nicht erlaubt andere Arten von Konvertierungen zu machen.
  3. Besetzungen sind von Natur aus hässlich - Sie als Programmierer setzen sich darüber hinweg, wie der Compiler normalerweise behandeln würde Code behandeln würde. Sie sagen damit dem Compiler: "Ich weiß es besser als du." Da dies der Fall ist, ist es sinnvoll dass die Durchführung eines Casts eine mäßig schmerzhafte Sache sein sollte, und dass sie in Ihrem Code auffallen sollten Code auffallen sollten, da sie eine wahrscheinliche Quelle von Problemen sind.

Siehe Wirksames C++ Einführung

0 Stimmen

Ich stimme völlig mit diesem für Klassen, aber macht die Verwendung von C++-Stil cast's für POD-Typen sinnvoll?

0 Stimmen

Ich glaube schon. Alle drei Gründe treffen auf PODs zu, und es ist hilfreich, nur eine Regel zu haben, anstatt getrennte Regeln für Klassen und PODs.

0 Stimmen

Interessant, ich muss vielleicht ändern, wie ich meine Casts in Zukunft Code für POD-Typen zu tun.

6voto

Pitarou Punkte 2195

Es geht darum, wie viel Typensicherheit Sie auferlegen wollen.

Wenn Sie schreiben (bar) foo (was gleichbedeutend ist mit reinterpret_cast<bar> foo wenn Sie keinen Typkonvertierungsoperator angegeben haben), weisen Sie den Compiler an, die Typsicherheit zu ignorieren und einfach zu tun, was ihm gesagt wird.

Wenn Sie schreiben static_cast<bar> foo bitten Sie den Compiler, zumindest zu prüfen, ob die Typumwandlung sinnvoll ist, und bei ganzzahligen Typen einen Umwandlungscode einzufügen.


BEARBEITEN 2014-02-26

Ich habe diese Antwort vor mehr als 5 Jahren geschrieben, und ich habe sie falsch verstanden. (Siehe Kommentare.) Aber sie wird immer noch hochgestuft!

9 Stimmen

(bar)foo ist nicht gleichbedeutend mit reinterpret_cast<bar>(foo). Die Regeln für "(TYPE) expr" besagen, dass es den geeigneten Cast im C++-Stil wählt, der reinterpret_cast enthalten kann.

1 Stimmen

Gutes Argument. Euro Micelli hat die endgültige Antwort auf diese Frage gegeben.

1 Stimmen

Außerdem ist es static_cast<bar>(foo) , mit Klammern. Dasselbe gilt für reinterpret_cast<bar>(foo) .

6voto

Konrad Punkte 37581

C Style Casts sind in einem Codeblock leicht zu übersehen. Casts im C++-Stil sind nicht nur die bessere Praxis, sie bieten auch ein viel höheres Maß an Flexibilität.

reinterpret_cast ermöglicht die Umwandlung von Integral- in Zeigertypen, kann aber bei Missbrauch unsicher sein.

static_cast bietet eine gute Konvertierung für numerische Typen, z.B. von enums zu ints oder ints zu floats oder andere Datentypen, deren Typ Sie sicher sind. Es werden keine Laufzeitprüfungen durchgeführt.

dynamic_cast hingegen führt diese Prüfungen durch und kennzeichnet alle mehrdeutigen Zuweisungen oder Umwandlungen. Es funktioniert nur bei Zeigern und Referenzen und verursacht einen Overhead.

Es gibt noch einige andere, aber das sind die wichtigsten, auf die Sie stoßen werden.

5voto

prakash Punkte 56997

Static_cast kann neben der Manipulation von Zeigern auf Klassen auch zur Durchführung von Konvertierungen verwendet werden, die explizit in Klassen definiert sind, sowie zur Durchführung von Standardkonvertierungen zwischen Grundtypen:

double d = 3.14159265;
int    i = static_cast<int>(d);

7 Stimmen

Warum sollte jemand schreiben static_cast<int>(d) allerdings, wenn (int)d so viel prägnanter und lesbarer ist? (Ich meine im Fall von Grundtypen, nicht von Objektzeigern.)

0 Stimmen

@gd1 - Warum sollte jemand Konsistenz über Lesbarkeit stellen? (eigentlich halb ernst)

2 Stimmen

@ToddLehman : Ich bin der Meinung, dass es keinen Sinn macht, für bestimmte Typen eine Ausnahme zu machen, nur weil sie für Sie etwas Besonderes sind, und ich bin auch mit Ihrem Begriff der Lesbarkeit nicht einverstanden. Kürzere Texte sind nicht gleichbedeutend mit besserer Lesbarkeit, wie ich an dem Bild sehe, das Sie in einem anderen Kommentar gepostet haben.

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