Оператор static_cast

Преобразует выражение в тип type-id, основываясь только на типах, присутствующих в выражении.

Синтаксис

static_cast <type-id> ( expression )

Remarks

В стандартном языке C++, проверка типа во время выполнения не выполняется, что обеспечивает безопасность преобразования. В C ++/CX выполняются проверки во время компиляции и во время выполнения. Дополнительные сведения см. в разделе Приведение.

Оператор static_cast можно использовать для таких операций, как преобразование указателя в базовый класс в указатель на производный класс. Такие преобразования не всегда являются безопасными.

Как правило, вы используете static_cast , если требуется преобразовать числовые типы данных, такие как перечисления в ints или ints в числа с плавающей точкой, и вы уверены в типах данных, участвующих в преобразовании. static_castПреобразования не так безопасны, как dynamic_cast преобразования, так как static_cast не проверка тип среды выполнения, а dynamic_cast не делает. Объект dynamic_cast для неоднозначного указателя будет завершаться ошибкой static_cast , в то время как возвращается, как если бы ничего не было плохого; это может быть опасно. Хотя dynamic_cast преобразования являются более безопасными, dynamic_cast работает только с указателями или ссылками, а тип времени выполнения проверка является накладной нагрузкой. Дополнительные сведения см. в разделе Оператор dynamic_cast.

В следующем примере строка D* pd2 = static_cast<D*>(pb); небезопасна, поскольку D может иметь поля и методы, не входящие в B. Однако строка B* pb2 = static_cast<B*>(pd); является безопасным преобразованием, поскольку D всегда содержит все 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.
}

В отличие от dynamic_cast, при преобразовании pbне выполняется static_cast проверка во время выполнения. Объект, на который указывает pb, может не быть объектом типа D, и в этом случае использование *pd2 может привести ужасным последствиям. Например, вызов функции, являющейся членом класса D, но не класса B, может привести к нарушению прав доступа.

Операторы dynamic_cast и static_cast перемещают указатель по иерархии классов. Однако зависит исключительно от информации, static_cast предоставленной в операторе приведения, и поэтому может быть небезопасным. Пример:

// 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);
}

Если pb действительно указывает на объект типа D, pd1 и pd2 получат одно и то же значение. Также они получат одно и то же значение, если pb == 0.

Если pb указывает на объект типа B , а не на полный D класс, то dynamic_cast будет достаточно знать, чтобы вернуть ноль. Однако полагается static_cast на утверждение программиста, которое pb указывает на объект типа D и просто возвращает указатель на этот предполагаемый D объект.

Следовательно, static_cast может выполнять обратные неявные преобразования, в этом случае результаты не определены. Программист должен убедиться, что результаты преобразования являются безопасными static_cast .

Это поведение также применяется к типам, отличным от типов класса. Например, static_cast можно использовать для преобразования из типа int в char. Однако результирующий char объект может не содержать достаточно битов для хранения всего int значения. Опять же, программист должен убедиться, что результаты преобразования являются безопасными static_cast .

Оператор static_cast также можно использовать для выполнения любого неявного преобразования, включая стандартные преобразования и определяемые пользователем преобразования. Пример:

// 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 может явно преобразовать целочисленное значение в тип перечисления. Если значение типа целого не оказывается в диапазоне значений перечисления, получаемое значение перечисления не определено.

Оператор static_cast преобразует значение пустого указателя в значение пустого указателя целевого типа.

Любое выражение может быть явно преобразовано в тип void оператором static_cast . Конечный тип void может при необходимости включать constатрибут , volatileили __unaligned .

Оператор static_cast не может отбросить атрибуты const, volatileили __unaligned . Сведения об удалении этих атрибутов см. в разделе Оператор const_cast .

C++/CLI: Из-за опасности выполнения непроверенных приведения поверх перемещаемого сборщика мусора использование static_cast должно быть в коде, критическом для производительности, только если вы уверены, что он будет работать правильно. Если необходимо использовать static_cast в режиме выпуска, замените его safe_cast в отладочных сборках, чтобы обеспечить успешное выполнение.

См. также раздел

Операторы приведения
Ключевые слова