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 pb
Laufzeitü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. Zum 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. Zum 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 const
Attribut , volatile
oder __unaligned
das Attribut enthalten.
Der static_cast
Operator kann die const
Attribute volatile
oder __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.