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

См. также

Ссылки

Операторы приведения

Ключевые слова C++