Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Преобразует выражение в тип идентификатора типа, основываясь только на типах, присутствующих в выражении.
Синтаксис
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, может привести к нарушению прав доступа.
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 преобразует значение указателя NULL в значение null указателя целевого типа.
Любое выражение можно явно преобразовать в тип void оператором static_cast . Тип конечной пустоты может дополнительно включать constvolatileатрибут или __unaligned атрибут.
Оператор static_cast не может отбросить constvolatileатрибуты или __unaligned атрибуты. Сведения об удалении этих атрибутов см . в const_cast операторе .
C++/CLI: из-за опасности выполнения незаверенных приведения на вершине перемещаемого сборщика мусора использование static_cast должно находиться только в критическом коде производительности, если вы уверены, что он будет работать правильно. Если вы должны использовать static_cast в режиме выпуска, замените его safe_cast в сборках отладки, чтобы убедиться в успешном выполнении.