Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Konwertuje wyrażenie na typ identyfikatora typu na podstawie tylko typów, które znajdują się w wyrażeniu.
Składnia
static_cast <type-id> ( expression )
Uwagi
W standardowym C++ nie jest wykonywane żadne sprawdzenie typu w czasie wykonywania, aby pomóc w zapewnieniu bezpieczeństwa konwersji. W C++/CX, wykonywane są sprawdzenia czasu kompilacji i czasu wykonywania. Aby uzyskać więcej informacji, zobacz Rzutowanie.
Operator static_cast może służyć do wykonywania operacji, takich jak konwertowanie wskaźnika na klasę bazową na wskaźnik do klasy pochodnej. Takie konwersje nie zawsze są bezpieczne.
Ogólnie rzecz biorąc, gdy static_cast chcesz przekonwertować typy danych liczbowych, takie jak wyliczenia na liczby ints lub ints na liczby zmiennoprzecinkowe, i masz pewne typy danych biorące udział w konwersji.
static_cast konwersje nie są tak bezpieczne, jak dynamic_cast konwersje, ponieważ static_cast nie ma sprawdzania typu czasu wykonywania, podczas gdy dynamic_cast jest to wykonywane. Wskaźnik dynamic_cast z niejednoznacznym wskaźnikiem zakończy się niepowodzeniem static_cast , a zwracane tak, jakby nic nie było złe; może to być niebezpieczne. Chociaż dynamic_cast konwersje są bezpieczniejsze, dynamic_cast działa tylko na wskaźnikach lub odwołaniach, a sprawdzanie typu czasu wykonywania jest obciążeniem. Aby uzyskać więcej informacji, zobacz operator dynamic_cast.
W poniższym przykładzie wiersz D* pd2 = static_cast<D*>(pb); nie jest bezpieczny, ponieważ D może zawierać pola i metody, które nie znajdują się w Bpliku . Jednak wiersz B* pb2 = static_cast<B*>(pd); jest bezpieczną konwersją, ponieważ D zawsze zawiera wszystkie elementy B.
// 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.
}
W przeciwieństwie do dynamic_cast podczas konwersji static_castelementu nie jest wykonywane pb sprawdzanie czasu wykonywania. Obiekt wskazywany przez pb może nie być obiektem typu D, w którym przypadku użycie *pd2 obiektu może być katastrofalne. Na przykład wywołanie funkcji, która jest składową D klasy, ale nie B klasy, może spowodować naruszenie dostępu.
Operatory dynamic_cast i static_cast przenoszą wskaźnik w całej hierarchii klas.
static_cast Jednak opiera się wyłącznie na informacjach podanych w oświadczeniu obsady i dlatego może być niebezpieczna. Na przykład:
// 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);
}
Jeśli pb naprawdę wskazuje obiekt typu D, i pd1pd2 otrzyma tę samą wartość. Otrzymają również tę samą wartość, jeśli pb == 0.
Jeśli pb wskazuje obiekt typu B , a nie do pełnej D klasy, będzie dynamic_cast wiedział wystarczająco dużo, aby zwrócić zero. Jednak opiera się na asercji programisty, static_cast która pb wskazuje obiekt typu D i po prostu zwraca wskaźnik do tego rzekomego D obiektu.
static_cast W związku z tym może wykonać odwrotność niejawnych konwersji, w tym przypadku wyniki są niezdefiniowane. Pozostaje programista, aby sprawdzić, czy wyniki konwersji static_cast są bezpieczne.
To działanie dotyczy także innych typów niż typy klas. Na przykład static_cast można użyć do konwersji z int na .char Jednak wynik char może nie mieć wystarczającej liczby bitów do przechowywania całej int wartości. Ponownie pozostaje programista, aby sprawdzić, czy wyniki static_cast konwersji są bezpieczne.
Operator może również służyć do przeprowadzania static_cast dowolnej niejawnej konwersji, w tym konwersji standardowych i konwersji zdefiniowanych przez użytkownika. Na przykład:
// 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);
}
Operator static_cast może jawnie przekonwertować wartość całkowitą na typ wyliczenia. Jeśli wartość typu całkowitego nie wchodzi w zakres wartości wyliczenia, wynikowa wartość wyliczenia jest niezdefiniowana.
Operator static_cast konwertuje wartość wskaźnika null na wartość wskaźnika null typu docelowego.
Dowolne wyrażenie można jawnie przekonwertować na typ void przez static_cast operator. Typ pustki docelowej może opcjonalnie zawierać constatrybut , volatilelub __unaligned .
Operator static_cast nie może odrzucić constatrybutów , volatilelub __unaligned . Aby uzyskać informacje na temat usuwania tych atrybutów, zobacz const_cast Operator .
C++/CLI: Ze względu na niebezpieczeństwo wykonywania niezaznaczone rzutowania na podstawie przeniesienia modułu odśmiecania pamięci użycie elementu static_cast powinno znajdować się tylko w kodzie krytycznym dla wydajności, jeśli masz pewność, że będzie działać poprawnie. Jeśli musisz użyć static_cast w trybie wydania, zastąp go safe_cast w kompilacjach debugowania, aby zapewnić powodzenie.