Явное приведение static_cast в С++, начало знакомства

В С++ можно явно приводить типы с помощью операции static_cast. В связи с тем, что эта операция немного более сложная, чем может показаться, имеет смысл разделить знакомство со static_cast на два этапа:
1. Поверхностное знакомство.
2. Подкрепление знаний о static_cast (этой темы на сайте нет).

Дело в том, что чтобы полноценно познакомится со static_cast, нужно познакомится с классами и наследованием. И нужно понять наследование. Так как static_cast применяется ещё до знакомства с классами, то первым будет просто поверхностное ознакомление. Т. е. эта статья ограничена совсем слабой информированностью о static_cast.

В С++ можно использовать различные виды явного приведения типов:
dynamic_cast
static_cast
const_cast
reinterpret_cast

Создатель языка С++: Бьярне Страуструппе — считал, что приведения в стиле языка С++ и в функциональном стиле приведения обладают ужасным свойством: позволяют не вникать в то, что именно они делают. Поэтому в С++ была добавлена возможность явных приведений с помощью операций, перечисленных выше. Эти операции ограничены в своих возможностях, а их непонятные поначалу названия хорошо отображают цель использования приведения и помогают избежать некоторых ошибок ещё на стадии написания кода.

Так как эта статья ограничена static_cast, то дальше будет написано только про static_cast и, как было сказано ранее, только частично.

  • Механизм приведения static_cast выглядит следующим образом:

static_cast<тип>(ВЫРАЖЕНИЕ);
Тип — название типа, к которому приводится выражение.
ВЫРАЖЕНИЕ — выражение, тип которого приводится.

Так как язык С++ есть надмножество С, и для совместимости с написанными на С прогаммами, в С++ оставлено многое из С, в языке С++ можно использовать некоторые возможности С, что часто и применяется. Одной из такой возможностей является приведение типов с помощью круглых скобок:

Такое приведение считается экстримальным и использовать его крайне не рекомендуется. Вернёмся к тому, что в С++ есть четыре операции, которые ограничивают возможности при приведении типов. Одна из операций — static_cast. Наглядный пример ограничения в пользу static_cast перед С-style:

В показанном примере происходит попытка приведения типа int, отдаваемого функцией foo_int к типу void*. В случае с С-style приведением ошибок никаких нет и программа успешно запустится, но в ходе её работы могут возникнуть проблемы. Cогласно документации языка С++ операция static_cast позволяет явно преобразовать указатели связанных типов один в другой. Если программист использует static_cast для приведения встроенных в С++ примитивных типов, то операцией static_cast используются правила приведения встроенных типов. Если приведение не допускается, то static_cast не даст скомпилироваться программе, что было продемонстрировано выше: приведение целочисленного типа к указателю на этапе компиляции не удалось. Для собственного удобства можете считать, что если не можете присвоить в одну переменную значение какого-то выражения, то и static_cast не станет приводить тип того выражения к типу той переменной.

В случае же с типами, определёнными программистом, используются правила приведения, описанные программистом.
Вот более понятный пример:

Нельзя привести тип, который по сути есть строка, к типу число. C-style это допускает, static_cast более понятлив, скомпилироваться программе не даёт.

Я в примерах использовал указатель на void, к void можно привести любой тип данных. void и void* различные понятия.

Для первого знакомства этой информации должно хватить, дальнейшее знакомство всё глубже и глубже окунает в изучение классов. Если нужно выполнять приведение каких-то простых типов, встроенных в С++, то приведение с помощью static_cast оправдано.

Но не надо думать, что эта операция хороша. Любые приведения типов — дело плохое. Нужно максимально избегать необходимости приведения типов в серьёзных программах.

Советую отложить где-то закладку, что информация о static_cast была получена не в полном объёме, что после изучения полиморфизма, нужно вернуться к этому способу приведения типов.

  • Операция static_cast не может удалять атрибуты const, volatile
  • Операция static_cast выполнятся во время компиляции программы
  • Операция static_cast использует встроенные правила приведения для встроенных типов и программистские правила приведения в программистских типах
  • Операция static_cast выполнятся во время компиляции программы
  • Обычно static_cast используется, когда требуется преобразовать числовые типы данных

И ещё нужно помнить, что приоритет операций никто не отменял.


В некоторых случаях static_cast используют для обхода предупреждений о приведениях с потерей точности.
Все комментарии на сайте проверяются, поэтому ваш комментарий может появиться не сразу. Для вставки кода в комментарий используйте теги: [php]ВАШ_КОД[/php]

Добавить комментарий

Ваш e-mail не будет опубликован.

Поиск

 
     

Случайная книга в электронном формате

Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Классическая ошибка, которую совершают проектировщики абсолютно надежных систем, – недооценка изобретательности клинических идиотов.

Выражаю свою признательность

  • Максиму очень признателен за указание на мои ошибки и неточности.
  • Sergio ===> за оказание помощи в исправлении моих ошибок
  • Gen ===> за правильное стремление помочь другим новичкам и выявления моих ошибок