Преобразование типов(разница)

180
01 апреля 2019, 10:40

В чем заключается разница в использовании тип_данных(выражение) и (тип_данных)выражение?

Answer 1

Единственная разница между тип(выражение) и (тип)выражение в том, что первом случае имя типа должно быть одним словом, иначе произойдет ошибка компиляции.

Если оба варианта компилируются, то они полностью эквивалентны.

Пример:

auto a = int(1);       // ✓
auto b = int*(1);      // ошибка
auto c = const int(1); // ошибка
auto d = long int(1);  // ошибка
auto e = (int)1;       // ✓
auto f = (int*)1;      // ✓
auto g = (const int)1; // ✓
auto h = (long int)1;  // ✓

Есть еще (тип)(выражение) - это по сути (тип)выражение, но со скобками, добавленными к выражению. Между этими двумя вариантами разницы нет совсем (не считая случаев, когда скобки влияют на приоритет операций).

В чем заключается разница в использовании int(выражение) и (int)выражение?

Так как int - это одно слово, для него разницы нет.

P.S. тип(выражение) не работает в С.

Answer 2

(double)100 - это преобразование типа (cast conversion) в стандарте C. Плюсы такой способ поддерживает.

double(100) - стиль плюсов, это вызывает конструктор с преобразованием. Делает то-же самое, называется по разному.

double{100} - в С++11 всё то-же, но следит чтобы не было уменьшения точности.

Answer 3

Конструкция вида (тип) выражение называется C-style cast (cast notation) и служит для преобразования типов в языке С.

Конструкция вида тип(выражение) называется functional cast (functional notation) и было добавлено в С++. Такой синтаксис был полезен в ситуациях, когда получаемый объект не представлял собой значение в него переданное, например connection("url_string") (чего не могло быть в С). Существенным моментом является то, что

  • тип не может быть составным, т.е. запись long int(1) невалидна
  • выражение является опциональным, в таком случае выполняется direct-initialization

Разницы в использовании этих конструкций в С++ больше нет, так как для всех сценариев их использования появились альтернативные средства, позволяющие строже соблюдать типобезопасноть, избегать потери данных и точнее выражать намерения. Для преобразования типов служат static_cast, reinterpret_cast, const_cast, и разные специальные функции, такие как ::std::as_const. Для инициализации следует использовать синтаксис list initialization либо встроенные и пользовательские литералы.

READ ALSO
Определение букв в слове. C++

Определение букв в слове. C++

По заданию нужно определить, сколько вариантов анаграмм можно составить из букв, содержащихся в слове, которое ввёл пользовательБукв может...

156
Размер переменных в функциях

Размер переменных в функциях

Почему под параметр-переменную функции выделяется 4 байта оперативной памяти, если тип short (2 байта)?

258
Построить график функции с++ (WinAPi)

Построить график функции с++ (WinAPi)

Стоит задача:построить график функции на координатной плоскости при помощи WInApiС WinApi сталкиваюсь первый раз

224