static_cast-Operator

Konvertiert einen Ausdruck in den Typ der Typ-ID, basierend auf den Typen, die im Ausdruck vorhanden sind.

Syntax

static_cast <type-id> ( expression )

Hinweise

Im Standard-C++ wird zur Laufzeit keine Typüberprüfung durchgeführt, um die Sicherheit der Konvertierung zu gewährleisten. In C++/CX wird eine Überprüfung der Kompilierzeit und der Laufzeit durchgeführt. Weitere Informationen finden Sie unter Umwandlungdefiniert sind.

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

Im Allgemeinen verwenden static_cast Sie die Verwendung, wenn Sie numerische Datentypen wie Enumerationen in "Ints" oder "Int" in "floats" konvertieren möchten, und Sie sind sicher, welche Datentypen an der Konvertierung beteiligt sind. static_cast Konvertierungen sind nicht so sicher wie dynamic_cast Konvertierungen, da static_cast keine Laufzeittypüberprüfung durchgeführt wird, während dynamic_cast dies der Fall ist. A dynamic_cast to anbiguous pointer will fail, while a static_cast returns as if nothing was wrong; this can be dangerous. Obwohl dynamic_cast Konvertierungen sicherer sind, dynamic_cast funktioniert nur auf Zeigern oder Verweisen, und die Laufzeittypüberprüfung ist ein Overhead. Weitere Informationen finden Sie unter dynamic_cast Operator.

Im folgende Beispiel ist die Zeile D* pd2 = static_cast<D*>(pb); nicht sicher, da D Felder und Methoden aufweisen kann, die nicht in B enthalten sind. Allerdings ist die Zeile B* pb2 = static_cast<B*>(pd); eine sichere Konvertierung, da D immer alle Elemente von B enthä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_cast wird bei der static_cast Konvertierung keine pbLaufzeitüberprüfung durchgeführt. Das Objekt, auf das mit pb gezeigt wird, ist möglicherweise kein Objekt vom Typ D. In diesem Fall kann die Verwendung von *pd2 zu schwerwiegenden Fehlern führen. Beispielsweise kann das Aufrufen einer Funktion, die ein Member der D-Klasse, aber nicht der B-Klasse ist, eine Zugriffsverletzung verursachen.

Mit den dynamic_cast Operatoren wird static_cast ein Zeiger über eine Klassenhierarchie verschoben. static_cast Stützt sich jedoch ausschließlich auf die in der Umwandlungserklärung enthaltenen Informationen und kann daher unsicher sein. Beispiel:

// 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 tatsächlich auf ein Objekt vom Typ D zeigt, erhalten pd1 und pd2 den gleichen Wert. Sie rufen außerdem den gleichen Wert ab, wenn pb == 0.

Wenn pb auf ein Objekt vom Typ B und nicht auf die vollständige D Klasse verweist, ist ausreichend bekannt, dynamic_cast um Null zurückzugeben. Basiert jedoch auf der Behauptung des Programmierers, static_cast die pb auf ein Objekt vom Typ D verweist, und gibt einfach einen Zeiger auf dieses vermeintliche D Objekt zurück.

static_cast Folglich kann die Umkehrung impliziter Konvertierungen erfolgen, in diesem Fall sind die Ergebnisse nicht definiert. Es bleibt dem Programmierer überlassen, zu überprüfen, ob die Ergebnisse einer static_cast Konvertierung sicher sind.

Dieses Verhalten gilt auch für andere Typen als Klassentypen. Kann beispielsweise verwendet werden, static_cast um von einem Int in ein char. Das Ergebnis char hat jedoch möglicherweise nicht genügend Bits, um den gesamten int Wert zu halten. Auch hier bleibt es dem Programmierer überlassen, zu überprüfen, ob die Ergebnisse einer static_cast Konvertierung sicher sind.

Der static_cast Operator kann auch verwendet werden, um eine implizite Konvertierung durchzuführen, einschließlich Standardkonvertierungen und benutzerdefinierten Konvertierungen. Beispiel:

// 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 integralen Wert explizit in einen Enumerationstyp konvertieren. Wenn der Wert des ganzzahligen Typs nicht innerhalb des Bereichs von Enumerationswerten liegt, ist der resultierende Enumerationswert nicht definiert.

Der static_cast Operator konvertiert einen Nullzeigerwert in den Nullzeigerwert des Zieltyps.

Jeder Ausdruck kann explizit in typ void vom static_cast Operator konvertiert werden. Der Ziel void-Typ kann optional das constAttribut , volatileoder __unaligned das Attribut enthalten.

Der static_cast Operator kann die constAttribute volatileoder __unaligned Attribute nicht entfernen. Informationen zum Entfernen dieser Attribute finden Sie unter const_cast Operator .

C++/CLI: Aufgrund der Gefahr, dass nicht überprüfte Umwandlungen über einem neu zugewiesenen Garbage Collector ausgeführt werden, sollte die Verwendung static_cast nur in leistungskritischem Code enthalten sein, wenn Sie sicher sind, dass sie ordnungsgemäß funktioniert. Wenn Sie den Releasemodus verwenden static_cast müssen, ersetzen Sie ihn durch safe_cast in Ihren Debugbuilds, um den Erfolg zu gewährleisten.

Siehe auch

Umwandlungsoperatoren
Schlüsselwörter