оператор static_cast
Преобразование Выражение тип тип-ИД, основывается только для типов, которые присутствуют в выражении.
static_cast <type-id> ( expression )
Заметки
Никакой проверки типа во время выполнения не производится, чтобы обеспечить безопасность преобразования.
static_cast оператор может использоваться для таких операций, как преобразовать указатель на базовый класс к указателю к производному классу.Такие преобразования всегда безопасными.
Обычно используется static_cast если нужно преобразовать числовые данные в виде перечислений в целых чисел или целых чисел, числа с плавающей запятой, а не забудьте типов данных, участвующие в преобразование.static_cast преобразования не безопасными как dynamic_cast преобразования, поскольку static_cast не выполняет никакую проверка типов на этапе выполнения, пока dynamic_cast делает.A dynamic_cast в неоднозначному указателю завершится ошибкой, пока a static_cast возвращает если ничего не было неправильно; это может быть набор unsafe.Как 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);
}
If pb действительно точки в объект типа Dпосле этого pd1 и pd2 получает одно и то же значение.Они также имеют одинаковое значение, если pb == 0.
If pb указатель на объект типа B а не к общему D класс, после чего dynamic_cast достаточно сведений для возврата на ноль.Однако static_cast разработчик полагается на утверждении; pb указатель на объект типа D и просто возвращает указатель на этот предположенный D объект.
следовательно, static_cast может сделать обратное неявных преобразований, при которых результаты не определены.Оно left программисту, чтобы убедиться, что результаты a static_cast преобразование безопасности.
Эта функциональности также применяется к типам за исключением типа класса.на пример, static_cast может использоваться для преобразования из типа int к a char.Однако приведение к char невозможно иметь соответствующие биты для хранения всей int значения.И снова она left программисту, чтобы убедиться, что результаты astatic_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 оператор.Тип свободного места назначения может также включать const" volatileили __unaligned атрибут.
static_cast оператор не может привести прочь const" volatileили __unaligned атрибуты.См. оператор const_cast дополнительные сведения об удалении этих атрибутов.
Из-за ошибок при выполнении непроверенных приведений поверх передислоцируя сборщика мусора использования static_cast только производительность-критическом должно находиться в Коде, когда есть уверенность он будет работать правильно.Если необходимо использовать static_cast в режиме выпуска, замените его с safe_cast в отладочные построения, чтобы гарантировать успешное завершение.