Operator static_cast
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 B
pliku . 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 pb
elementu nie jest wykonywane static_cast
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. 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 pd1
pd2
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. 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ć const
atrybut , volatile
lub __unaligned
.
Operator static_cast
nie może odrzucić const
atrybutów , volatile
lub __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.
Zobacz też
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla