static_cast Operator

Konvertiert Ausdruck auf den Typ der TYPE ID basierte nur für Typen, die in dem Ausdruck vorhanden sind.

static_cast <type-id> ( expression ) 

Hinweise

Keine Laufzeittyp der Überprüfung wird ausgeführt, um die Sicherheit der Konvertierung zu gewährleisten.

Der static_cast-Operator kann für Vorgänge wie das Konvertieren eines Zeigers auf eine Basisklasse in einen Zeiger auf eine abgeleitete Klasse verwendet werden.Diese Konvertierungen sind nicht immer sicher.

Im Allgemeinen verwenden Sie static_cast , wenn Sie numerische Datentypen wie Enumerationen für ints oder ints auf Gleitkommas sind, und Sie konvertieren möchten sicherstellen, dass die Datentypen der in der Konvertierung einbezogen sind.static_cast Konvertierungen sind nicht so sicher wie dynamic_cast Konvertierungen, da static_cast keine Überprüfung der Laufzeittyp, während dynamic_cast ausführt.dynamic_cast zu einem mehrdeutigen Zeiger kann nicht ausgeführt werden, während static_cast gibt als ob keine falsch waren. Dies kann gefährlich sein.Obwohl dynamic_cast Konvertierungen sicherer sind, funktioniert nur dynamic_cast oder Zeigern auf Verweise, und der Laufzeittyp der Überprüfung ist ein Mehraufwand.Weitere Informationen finden Sie unter Operator dynamic_cast.

Im folgende Beispiel wird die Zeile D* pd2 = static_cast<D*>(pb); nicht sicher, da D Felder und Methoden verfügen kann, die sich nicht in Bsind.Allerdings ist die Zeile B* pb2 = static_cast<B*>(pd); eine sichere Konvertierung, da D immer die gesamte Benthält.

// static_cast_Operator.cpp
// compile with: /LD
class B {};

class D : public B {};

void f(B* pb, D* pd) {
   D* pd2 = static_cast<D*>(pb);   // Not safe, D can have fields
                                   // and methods that are not in B.

   B* pb2 = static_cast<B*>(pd);   // Safe conversion, D always
                                   // contains all of B.
}

Im Gegensatz zu dynamic_castwird keine Laufzeitüberprüfung auf der static_cast Konvertierung von pbausgeführt.Das Objekt, das durch pb ist möglicherweise kein Objekt vom Typ D. In diesem Fall wird die Verwendung von *pd2 verhängnisvoll sein kann.Beispielsweise eine Funktion, die ein Member der D-Klasse, ist aber nicht die B Aufrufen der Klasse kann eine Zugriffsverletzung verursachen.

Die dynamic_cast und static_cast-Operatoren verschieben einen Zeiger während einer Klassenhierarchie.Es beruht static_cast ausschließlich auf den Informationen, die in der Umwandlungs Anweisung enthalten und kann daher unsicher sein.Beispiele:

// static_cast_Operator_2.cpp
// compile with: /LD /GR
class B {
public:
   virtual void Test(){}
};
class D : public B {};

void f(B* pb) {
   D* pd1 = dynamic_cast<D*>(pb);
   D* pd2 = static_cast<D*>(pb);
}

Wenn pb sich tatsächlich zu einem Objekt des Typs Dwird, und rufen pd1 und pd2 denselben Wert ab.Sie rufen außerdem den gleichen Wert wenn pb == 0ab.

Wenn pb in ein Objekt des Typs B und zur vollständigen D-Klasse verweist, nicht kennt dynamic_cast genug, um null zurückgegeben.Es beruht auf der static_cast Assertion des Programmierers, dass pb in ein Objekt des Typs D zeigt und einfach einen Zeiger auf diesen angenommenen D-Objekt zurückgibt.

Daher kann static_cast das Gegenteil von impliziten Konvertierungen möglich, in diesem Fall die Ergebnisse nicht definiert werden.Sie wird für den Programmierer lassen, um sicherzustellen, dass das Ergebnis einer Konvertierung static_cast sicher sind.

Dieses Verhalten gilt auch für andere Typen als Klassentypen.Beispielsweise kann static_cast verwendet werden, um von charin einen ganzzahligen Typ konvertiert werden können.Allerdings verfügt möglicherweise nicht über genügend char resultierende Bits int , um den gesamten Wert aufzunehmen.Auch hier ist es für den Programmierer lassen, um sicherzustellen, dass das Ergebnis einerKonvertierungstatic_cast sicher sind.

Der static_cast-Operator kann auch verwendet werden, um jede implizite Konvertierung, einschließlich Standardwert konvertierungen und benutzerdefinierte Konvertierungen.Beispiele:

// static_cast_Operator_3.cpp
// compile with: /LD /GR
typedef unsigned char BYTE;

void f() {
   char ch;
   int i = 65;
   float f = 2.5;
   double dbl;

   ch = static_cast<char>(i);   // int to char
   dbl = static_cast<double>(f);   // float to double
   i = static_cast<BYTE>(ch);
}

Der static_cast-Operator kann einen ganzzahligen Wert in einen Enumerationstyp explizit konvertieren.Wenn der Wert des ganzzahligen Typs nicht innerhalb des Bereichs von Enumerationswerten endet, wird der resultierende Enumerationswert nicht definiert.

Der static_cast-Operator konvertiert einen NULL-Zeiger-Wert zum NULL-Zeiger-Wert des Zieltyps.

Jeder Ausdruck kann, um static_cast vom Typ " void " Operators explizit konvertiert werden.Der Ziel- void-Typ kann const, volatileoder __unaligned-Attribut optional sind.

Der static_cast-Operator kann const, volatileoder Attribute __unaligned nicht so umwandeln.Weitere Informationen finden Sie unter const_cast Operator Informationen über das Entfernen dieser Attribute.

Aufgrund der Gefahr der Ausführung von deaktivierten Typumwandlungen in einen verschiebenden Garbage Collection, sollte die Verwendung von static_cast im Leistung-wichtigen Code nur, wenn Sie sicher sind, dass sie ordnungsgemäß funktioniert.Wenn Sie static_cast im Releasemodus verwenden möchten, ersetzen Sie ihn durch safe_cast in Debugbuilds, um Erfolg sicherzustellen.

Siehe auch

Referenz

Umwandlungsoperatoren

C++-Schlüsselwörter