Operator static_cast
Konwertuje wyrażenie do typu identyfikator typu oparte tylko na typy, które są obecne w wyrażeniu.
static_cast <type-id> ( expression )
Uwagi
Sprawdzanie typu run-time nie jest dokonać pomóc w zapewnieniu bezpieczeństwa konwersji.
static_cast Dla operacji, takich jak konwersja wskaźnik do klasy podstawowej do wskaźnika do klasy pochodnej można używać operatora.Konwersje takie nie zawsze są bezpieczne.
Na ogół używany static_cast niektórych typów danych przy konwersji typów danych liczbowych, takich jak teksty stałe wskazówki lub wskazówki pływaków, a są zaangażowane w wyniku konwersji.static_castKonwersje nie są tak samo bezpieczne jak dynamic_cast konwersji, ponieważ static_cast jest sprawdzana Brak typu run-time, podczas gdy dynamic_cast jest.A dynamic_cast do wskaźnika niejednoznaczne zakończą się niepowodzeniem, podczas gdy static_cast zwraca wartość tak, jakby nic nie były niewłaściwe; może być niebezpieczne.Chociaż dynamic_cast konwersje są bezpieczniejsze, dynamic_cast tylko prac na wskaźniki lub odniesienia i kontrola typów w czasie wykonywania jest obciążenie.Aby uzyskać więcej informacji, zobacz Operator dynamic_cast.
W przykładzie, który następuje linii D* pd2 = static_cast<D*>(pb); nie jest bezpieczne ponieważ D może mieć pól i metod, które nie są w B.Jednakże linii B* pb2 = static_cast<B*>(pd); jest bezpieczne konwersji, ponieważ D zawsze zawiera wszystkie 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, sprawdzanie run-time nie jest dokonane na static_cast konwersji pb.Obiekt wskazywanej przez pb nie może być obiektem typu D, w którym to przypadku użycia z *pd2 mogłyby być katastrofalne.Na przykład, wywołując funkcję, która jest członkiem D klasy, ale nie B klasy, może spowodować naruszenie zasad dostępu.
dynamic_cast i static_cast operatorów wskaźnika całej hierarchii klas.Jednakże static_cast opiera się wyłącznie na informacje podane w instrukcji cast i dlatego może być niebezpieczne.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 na obiekt typu D, następnie pd1 i pd2 otrzyma taką samą wartość.Również wystąpi tę samą wartość, jeśli pb == 0.
Jeśli pb wskazuje na obiekt typu B , a nie do kompletnego D klasy, a następnie dynamic_cast będą wiedzieć, wystarczy zwrócić zero.Jednakże static_cast opiera się na twierdzenia programmer's, pb wskazuje na obiekt typu D i po prostu zwraca wskaźnik do że rzekome D obiektu.
W konsekwencji static_cast można wykonać odwrotność konwersje niejawne, w którym to przypadku wyniki są niezdefiniowane.Jest on pozostawiony do programisty, aby zweryfikować, czy wyniki static_cast konwersji są bezpieczne.
To działanie dotyczy także innych typów niż typy klas.Na przykład static_cast mogą być używane do konwersji z int do char.Jednak wynikowy char może nie mieć wystarczającą ilość bitów, aby pomieścić cały int wartości.Ponownie, jest on pozostawiony do programisty, aby zweryfikować, czy wynikistatic_cast konwersji są bezpieczne.
static_cast Operator można również przeprowadzić niejawna konwersja, w tym konwersji standardowych i konwersje zdefiniowane 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);
}
static_cast Operatora można jawnie przekonwertować wartością całkowitą typ wyliczenia.Jeśli wartość typu integralną nie wchodzą w zakres wartości wyliczenia, wynikowy wartość wyliczenia jest niezdefiniowany.
static_cast Operator konwertuje wartość na wskaźnik null wartość null wskaźnika typu miejsca docelowego.
Każde wyrażenie można jawnie przekonwertować typu void przez static_cast operatora.Typ void przeznaczenia można opcjonalnie uwzględnić const, volatile, lub __unaligned atrybut.
static_cast Operatora nie można rzutować away const, volatile, lub __unaligned atrybuty.Zobacz const_cast Operator Aby uzyskać informacje dotyczące usuwania tych atrybutów.
Ze względu na niebezpieczeństwo wykonywania niezaznaczone poświaty na górze przemieszczenie garbage collector wykorzystanie static_cast tylko należy w kodzie wydajności krytyczne, gdy będzie działać poprawnie.Jeśli musisz użyć static_cast w trybie wersji zastąpić go z safe_cast w sieci kompilacje debugowania, aby zapewnić sukces.