Оператор 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 в отладочных сборках, чтобы обеспечить успешное выполнение.