WikiSort.ru - Программирование

ПОИСК ПО САЙТУ | о проекте

Операция static_cast в языке C++ осуществляет явное допустимое приведение типа данных[1].

Синтаксис: static_cast < type_to > ( object_from )

Пример

int nShots = 10, nHits = 8;
auto hitRate = static_cast<float>(nHits) / nShots;

Возможные преобразования типов

static_cast создан для выполнения всех видов преобразований, разрешенных компилятором[2]. Все преобразования работают, только если есть совместимость по const и volatile .

1. Любое из преобразований типа, которые Си++ производит неявно (например, массива в указатель, одного числового типа в другой, неявный вызов конструктора). Явное написание static_cast может потребоваться, например:

  • в шаблоне;
  • для выбора, какую версию функции или операции использовать: auto hitRate = static_cast<float>(nHits) / nShots;
  • чтобы подавить предупреждение компилятора «Возможна потеря точности»: double a = 1.0; auto b = static_cast<float>(a);
  • чтобы согласовать типы в трёхместной условной операции: Base& x = use1 ? static_cast<Base&>(obj1) : static_cast<Base&>(obj2); .

2. Если соответствующее преобразование отмечено ключевым словом explicit .

3. Преобразование из/в тип enum class .

4. Если в программе участвует указатель на функцию — для явного указания, какую из перегруженных функций брать.

std::transform(s.begin(), s.end(), s.begin(), static_cast<int(*)(int)>(std::toupper));

Оператор static_cast может использоваться для следующих преобразований:

  • приведение указателя базового класса к указателю производного класса (без проверок типа во время выполнения);
  • преобразование численного типа enums в int или int в float и наоборот;
  • преобразования с изменением разрядности (например, из int в char) и с изменением знака (например, из unsigned short int в unsigned int);
  • явный вызов метода класса, выполняющего преобразование класса к значению нужного типа.

Преобразования, выполняемые с помощью static_cast, небезопасны, так как проверка типов выполняется только на этапе компиляции; во время выполнения могут преобразовываться значения несовместимых типов.

Возможные логические ошибки

Возможные ошибки зависят от того, какое преобразование проводится. Например, при преобразовании int enum class переменная может заполучить недопустимое значение и программа не будет готова к этому.

См. также

Примечания

  1. Programming: principles and practice using C++. США : Addison-Wesley, 2008. — С. 594. ISBN 0321543726.
  2. Thinking in C++. США : Alan Apt, 2000. — С. 857. ISBN 0-13-979809-9.

Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".

Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.

Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .




Текст в блоке "Читать" взят с сайта "Википедия" и доступен по лицензии Creative Commons Attribution-ShareAlike; в отдельных случаях могут действовать дополнительные условия.

Другой контент может иметь иную лицензию. Перед использованием материалов сайта WikiSort.ru внимательно изучите правила лицензирования конкретных элементов наполнения сайта.

2019-2024
WikiSort.ru - проект по пересортировке и дополнению контента Википедии