Udostępnij za pośrednictwem


Operator static_cast

Konwertuje expression do typu type-id, wyłącznie według typów, które są obecne w wyrażeniu.

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 (C + +/ CX).

Operator static_cast może być używany do operacji takich, jak konwertowanie wskaźnika do klasy podstawowej na wskaźnik do klasy pochodnej.Takie konwersje nie zawsze są bezpieczne.

Zazwyczaj używasz static_cast, gdy chcesz przekonwertować typy danych numerycznych, takie jak typy wyliczeniowe na liczby całkowite lub liczby całkowite na liczby zmiennopozycyjne i wiesz na pewno, jakie są typy danych związane z konwersją.Konwersje static_cast nie są tak bezpieczne, jak konwersje dynamic_cast, ponieważ static_cast nie sprawdza żadnych typów w czasie wykonywania, podczas gdy dynamic_cast sprawdza typy.Konwersja dynamic_cast do niejednoznacznego wskaźnika zakończy się niepowodzeniem, podczas gdy static_cast zwraca wartość, jak gdyby nic się nie stało; może to być niebezpieczne.Chociaż konwersje dynamic_cast są bezpieczniejsze, dynamic_cast działa tylko w przypadku wskaźników lub odwołań, a sprawdzenie typów w czasie wykonywania jest tylko dodatkiem.Aby uzyskać więcej informacji, zobacz Operator dynamic_cast.

W przykładzie poniżej, wiersz D* pd2 = static_cast<D*>(pb); nie jest bezpieczny, gdyż D może mieć pola i metody, które nie należą do B.Jednakże 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, na konwersji static_castpb nie jest wykonywane sprawdzenie czasu wykonywania.Obiekt wskazywany przez pb nie może być obiektem typu D, w którym to przypadku stosowanie *pd2 mogłoby być katastrofalne.Na przykład, wywołanie funkcji, która jest elementem członkowskim klasy D, ale nie klasy B, może spowodować naruszenie zasad dostępu.

Operatory dynamic_cast i static_cast przesuwają wskaźnik w całej hierarchii klas.Jednakże konwersja static_cast opiera się wyłącznie na informacjach dostarczonych w instrukcji cast 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 na obiekt typu D, wówczas pd1 i pd2 otrzymają taką samą wartość.Otrzymają one również taką samą wartość, jeśli pb == 0.

Jeśli pb wskazuje na obiekt typu B, a nie na pełną klasę D, wówczas dynamic_cast będzie wiedzieć wystarczająco dużo, aby zwrócić zero.Jednakże static_cast opiera się na potwierdzeniu programisty, że pb wskazuje na obiekt typu D i po prostu zwraca wskaźnik do tego domniemanego obiektu D.

W związku z tym static_cast może wykonać odwrotność konwersji niejawnych; w tym przypadku wyniki są niezdefiniowane.Do programisty należy sprawdzenie, 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że być używana da konwersji z int do char.Jednak wynikowy char może nie mieć wystarczającej liczby bitów, aby pomieścić całą wartość int.Ponownie, do programisty należy sprawdzenie, czy wyniki konwersjistatic_cast są bezpieczne.

Operator static_cast może również służyć do wykonywania 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ść pustego wskaźnika do wartości pustego wskaźnika typu miejsca docelowego.

Każde wyrażenie może być jawnie konwertowane na typ void przez operator static_cast.Docelowy typ void może opcjonalnie uwzględnić atrybut const, volatile lub __unaligned.

Operator static_cast nie może odrzucić atrybutów const, volatile lub __unaligned.Zobacz Operator const_cast, aby uzyskać informacje na temat usuwania tych atrybutów.

Ze względu na niebezpieczeństwo wykonywania niesprawdzonych rzutowań ponad przemieszczającym modułem odśmiecania pamięci, użycie static_cast powinno mieć miejsce tylko w kodzie newralgicznym dla wydajności, gdy wiesz na pewno, że będzie działać poprawnie.Jeśli musisz użyć static_cast w trybie release, zastąp go przez safe_cast w swoich kompilacjach debugowania, aby zapewnić prawidłowe działanie.

Zobacz też

Informacje

Operatory rzutowania

Słowa kluczowe języka C++