В чем заключается разница в использовании тип_данных(выражение) и (тип_данных)выражение?
Единственная разница между тип(выражение)
и (тип)выражение
в том, что первом случае имя типа должно быть одним словом, иначе произойдет ошибка компиляции.
Если оба варианта компилируются, то они полностью эквивалентны.
Пример:
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. тип(выражение)
не работает в С.
(double)100
- это преобразование типа (cast conversion) в стандарте C. Плюсы такой способ поддерживает.
double(100)
- стиль плюсов, это вызывает конструктор с преобразованием. Делает то-же самое, называется по разному.
double{100}
- в С++11 всё то-же, но следит чтобы не было уменьшения точности.
Конструкция вида (тип) выражение
называется 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 либо встроенные и пользовательские литералы.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Какие существуют виды рекламных бордов и как выбрать подходящий?
По заданию нужно определить, сколько вариантов анаграмм можно составить из букв, содержащихся в слове, которое ввёл пользовательБукв может...
Почему под параметр-переменную функции выделяется 4 байта оперативной памяти, если тип short (2 байта)?
Стоит задача:построить график функции на координатной плоскости при помощи WInApiС WinApi сталкиваюсь первый раз