Оператор static_cast
Преобразует выражение в тип идентификатора типа, основываясь только на типах, присутствующих в выражении.
Синтаксис
static_cast <type-id> ( expression )
Замечания
В стандартном языке C++, проверка типа во время выполнения не выполняется, что обеспечивает безопасность преобразования. В C ++/CX выполняются проверки во время компиляции и во время выполнения. Дополнительные сведения см. в разделе Приведение.
Оператор static_cast
можно использовать для операций, таких как преобразование указателя в базовый класс в указатель на производный класс. Такие преобразования не всегда являются безопасными.
Как правило, вы static_cast
используете, когда требуется преобразовать числовые типы данных, такие как перечисления в инты или инты в с плавающей запятой, и некоторые типы данных, участвующие в преобразовании. 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, проверка времени выполнения не выполняется при static_cast
преобразованииpb
. Объект, на который указывает pb
, может не быть объектом типа D
, и в этом случае использование *pd2
может привести ужасным последствиям. Например, вызов функции, являющейся членом класса D
, но не класса B
, может привести к нарушению прав доступа.
static_cast
Операторы dynamic_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
преобразует значение указателя NULL в значение null указателя целевого типа.
Любое выражение можно явно преобразовать в тип void оператором static_cast
. Тип конечной пустоты может дополнительно включать const
volatile
атрибут или __unaligned
атрибут.
Оператор static_cast
не может отбросить const
volatile
атрибуты или __unaligned
атрибуты. Сведения об удалении этих атрибутов см . в const_cast операторе .
C++/CLI: из-за опасности выполнения не проверка приведения на вершине перемещенного сборщика мусора, использование static_cast
должно находиться только в критическом коде производительности, если вы уверены, что он будет работать правильно. Если вы должны использовать static_cast
в режиме выпуска, замените его safe_cast в сборках отладки, чтобы убедиться в успешном выполнении.
См. также
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по