Udostępnij za pośrednictwem


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.

Zobacz też

Informacje

Operatory odlewania

Słów kluczowych języka C++