3 / 4 / 3
Регистрация: 23.04.2017
Сообщений: 186
1

Приведение типов C-style cast

08.09.2019, 20:08. Показов 1735. Ответов 7
Метки нет (Все метки)

Чем отличается приведение типа (int)variable; от int(variable); (хотелось бы с углублениями как и что и почему) Гугл результатов не дал. Получается что во втором случае создается экземпляр класса или что?
0

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

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.09.2019, 20:08
Ответы с готовыми решениями:

C-style приведение типов
Из стандарта согласно пункту 5.4 Explicit type conversion (cast notation) насколько я понял каст в...

old style cast warning
#include <iostream> void test(int num){ std::cout << num; } int main(){ char c =...

Down-cast: объяснить нюансы нисходящего преобразования типов
Скажите, пожалуйста, если я сделаю bad down-cast при помощи static_cast: class Base{ public:...

C-style приведение типа: (T) x
Есть современные формы приведения типа: static_cast<T>(x) dynamic_cast<T>(x)...

7
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
08.09.2019, 20:25 2
Если необходимо сделать приведение типа к unsigned int, второй случай не прокатит.
В остальном без разницы.
0
Эксперт С++
8412 / 4087 / 892
Регистрация: 15.11.2014
Сообщений: 9,176
08.09.2019, 20:32 3
Цитата Сообщение от warcraft33 Посмотреть сообщение
(int)variable; от int(variable);
Цитата Сообщение от warcraft33 Посмотреть сообщение
Получается что во втором случае создается экземпляр класса или что?
всё верно.
если, конечно, тип int тоже считать классом.

и если на время забыть,
что в первом случае так же создается экземпляр класса.

а в остальном разницы нет.

Цитата Сообщение от L0M Посмотреть сообщение
Если необходимо сделать приведение типа к unsigned int, второй случай не прокатит.
верно.
если не считать того, что unsigned int и unsigned - синонимы.

C++
1
std::cout << unsigned(10) << '\n';
1
Мозгоправ
1728 / 1023 / 467
Регистрация: 01.10.2018
Сообщений: 2,136
Записей в блоге: 2
08.09.2019, 20:36 4
Цитата Сообщение от hoggy Посмотреть сообщение
если не считать того, что unsigned int и unsigned - синонимы.
Ок. А unsigned long?
0
Комп_Оратор)
Эксперт по математике/физике
8719 / 4426 / 598
Регистрация: 04.12.2011
Сообщений: 13,262
Записей в блоге: 16
08.09.2019, 21:48 5
Цитата Сообщение от L0M Посмотреть сообщение
Если необходимо сделать приведение типа к unsigned int, второй случай не прокатит.
L0M, к типу привести можно. Синтаксис можно обойти определив алиас. А вообще, я не встречал ни одного источника где отмечается разница. И то и то reinterpet_cast и временный объект создаётся всегда, кроме случая приведения к своему типу.
Цитата Сообщение от warcraft33 Посмотреть сообщение
Гугл результатов не дал.
первая ссылка по запросу 'приведение типа (int)variable; от int(variable) С++'
https://docs.microsoft.com/en-... ew=vs-2019
глава Explicit conversions (casts)
1
Evg
Эксперт CАвтор FAQ
21193 / 8209 / 633
Регистрация: 30.03.2009
Сообщений: 22,522
Записей в блоге: 30
08.09.2019, 22:15 6
Лучший ответ Сообщение было отмечено easybudda как решение

Решение

Цитата Сообщение от warcraft33 Посмотреть сообщение
Чем отличается приведение типа (int)variable; от int(variable);
Я не специалист по Си++, но на всякий случай выскажу своё мнение

Если бы речь шла не о встроенном типе, а о каком-нибудь классе типа T, то "(T)variable" - это вызов оператора приведения типа, а "T(variable)" - вызов конструктора. Т.е. это две разные сущности, которые в общем случае было бы логично реализовать одинаково, но мало ли

Для встроенных типов оператор приведения типа и конструктор с параметром другого типа - это некоторые встроенные понятия, которые работают заведомо одинаково. С этой точки зрения "int(value)" само по себе может показаться избыточной конструкцией (особенно с учётом постов #2 и #4), но на самом деле оно нужно при использовании в шаблонах, чтобы внутренности шаблона одинаково хорошо работали как для встроенных типов, так и для классов/структур
2
С чаем беда...
Эксперт CЭксперт С++
9078 / 4610 / 1251
Регистрация: 18.10.2014
Сообщений: 10,339
08.09.2019, 22:25 7
Цитата Сообщение от warcraft33 Посмотреть сообщение
Чем отличается приведение типа (int)variable; от int(variable); (хотелось бы с углублениями как и что и почему)
Ничем. Если во втором синтаксисе приведения типа в скобках указан ровно один аргумент, то он по определению 100% эквивалентен первому варианту.

Во втором синтаксисе в скобках может быть указано много аргументов (или ни одного аргумента), но это не ваш случай.

Цитата Сообщение от warcraft33 Посмотреть сообщение
Получается что во втором случае создается экземпляр класса или что?
Оба варианта эквивалентны. Тип int не является классом, поэтому никакого "экземпляра класса" тут не создается в любом случае.
1
Комп_Оратор)
Эксперт по математике/физике
8719 / 4426 / 598
Регистрация: 04.12.2011
Сообщений: 13,262
Записей в блоге: 16
08.09.2019, 23:22 8
Цитата Сообщение от Evg Посмотреть сообщение
Т.е. это две разные сущности, которые в общем случае было бы логично реализовать одинаково, но мало ли
Хорошее замечание, Evg. Действительно, в вопросе variable может быть любого типа, для которого приведение типа к int имеет смысл (как операция и в конструкторе преобразования). Так что C-style conversion (reinterpet_cast в C++) тут автоматически получится лишь для встроенных алгебраических типов.

Добавлено через 11 минут
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
 
struct ToIntConvertable
{
    char a;
    ToIntConvertable(int a_=65)
    :a(a_){cout<<"\nctor\n";}
     operator int(){cout<<"\noperator\n"; return a+1;}
};
 
int main()
{
ToIntConvertable a(97);
cout<<a.a<<endl;//a
cout<<(int)a<<endl;//98
int b=int(a);
cout<<b<<endl;//98
    return 0;
}
однако, нужно отметить, что речь в вопросе идет только о операции преобразования. Конструктор преобразования тут не работает.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.09.2019, 23:22

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

Error C2440: <function-style-cast>: невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
С++ Не работает программа! Задание было такое: напишите программу invert(p,x,n), возвращающую...

Приведение типов
Доброго времени суток. Есть вопрос. Допустим: class Base { ..... } class Derived:public...

Приведение типов
Добрый вечер! Реализовываю явное и не явное приведение типов. Есть два класса, сепаративных, A и...

Приведение типов
В чем различие привидения типа (type)expression, от type(expression)?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.