Udostępnij za pośrednictwem


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 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 pbelementu 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 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. 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.

Zobacz też

Operatory rzutowania
Słowa kluczowe