Преобразование в стиле С. Избегайте в С++

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

  • const_cast
  • static_cast
  • reinterpret_cast
  • dynamic_cast
  • Преобразование в стиле функций (functional cast)
  • Преобразование в стиле языка С
Каждое преобразование заслуживает своей отдельной темы. Сейчас мы ограничимся изучением преобразования в стиле языка С. Такой способ преобразования привлекателен своей простотой, но может быть достаточно опасным. Поскольку С++ является надмножеством языка С, то многое из языка С работает в С++. Одним из элементов языка С является способ преобразования типов. Способ, применяемый в языке С, когда название типа, к которому приводится некоторый приводимый тип, оборачивается скобками.

В листинге #1 целое делится на целое, но мы чтобы получить число с точкой преобразуем целые типы int в типы double. На самом деле достаточно привести либо только числитель, либо только знаменатель, но суть не в этом. Мы определяем какой нам тип нужен для определённого значения и обозначаем выбранный тип в скобках. Путём некоторых незаметных нам манипулций компилятора создаётся дополнительная переменная, тип которой оказывается тем, что указан нами в круглых скобках, а значение в ту созданную временную переменную приходит из приводимого объекта. Никакое преобразование типов не преобразует напрямую типы, а создаёт дополнительные переменные нужного типа. Так вот, в стиле С нужный тип просто оборачивается в скобки, а после завёрнутого в скобки типа пишут или непосредственное значение, или объект. Этот синтаксис настолько прост, что чем больше его объяснять, тем он сложнее будет казаться.
Преобразование в стиле С схоже с преобразованием в стиле функционального преобразования. В функциональном преобразовании в скобки заворачивается не тип, а объект, тип которого преобразовывается. Несмотря на то что такой способ преобразования очень похож на способ преобразования в стиле С, срабатывают разные механизмы компилятора. Поэтому имейте в виду, что описание преобразования в стиле С не включает в себя преобразование в функциональном варианте.

Преобразование в стиле С срабатывает таким образом, что в зависимости от кода срабатывает одно из преобразований С++. Можно сказать, что у преобразования в С стиле есть некоторое право на самоопределение.
  • Преобразование в стиле С срабатывает на этапе компиляции, до начала выполнения программы.
Если происходит попытка преобразования в стиле С, то компилятор пробует определить, возможно ли произвести выбранное преобразование. Порядок проверки можно определит в виде очереди:

  • const_cast
  • static_cast
  • static_cast + const_cast
  • reinterpret_cast
  • reinterpret_cast + const_cast
Порядок можно запомнить на основе силы каста: константы самые слабые, а реинтрепрет самые сильные. Если никакое из этих преобразований невозможно, то код просто не сможет быть скомпилирован.
  • У преобразования в стиле С есть особенность поведения при касте указателей/ссылок на неполные типы. Тогда выбор static или reinterpret зависит от реализации компилятора
Преобразования в стиле С считаются очень опасными. Вам всегда будут говорить, что преобразование в стиле С опасно, не делайте такого. И это правильно, пока не знаете, какие проблемы могут случиться, не нужно использовать в С++ способа преобразования пришедшего из языка С.
Подведём итоги этой короткой статьи.

В языке С++ следует избегать преобразований вообще. А преобразований в стиле С следует избегать в тем более.

Пара примеров, демонстрирующих возникновение проблемы:


Много всяких опасностей таит в себе неумелое использование приведение в стиле языка С. Это очень мощный инструмент, он плох не сам по себе, а тем, что если вдруг возникает ошибка от неумелого его использования, то из-за того что ошибка может проявиться не сразу, а даже через несколько лет, очень сложно выискивать источник проблемы.

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

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

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

28 − 27 =

Поиск

 
     

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

https://www.litres.ru/igor-savchuk/otyavlennyy-programmist-layfhaking-iz-pervyh-ruk/?lfrom=15589587
Яндекс.Метрика
НАГРАДИ АВТОРА САЙТА
WEBMONEY
R375024497470
U251140483387
Z301246203264
E149319127674

Отец перед сном рассказывает сыну сказку: - Жил на свете богатый человек. Купил он себе самый лучший компьютер и кучу лицензионных программ. - Пап, а как это - лицензионных? - Спи, сынок, я же сказал - это сказка! . .

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

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