Ответ 1
"Кастинг" выполняется только при явном преобразовании.
Как говорится, вы найдете этот термин неправильно используемым во всем Интернете и в разных командах!
Я изучаю С++ на два месяца, используя книгу: Принципы программирования и практику с использованием С++, и теперь я хотел уточнить некоторые сомнения относительно моего кастинга. Когда я выполняю неявное преобразование, например:
char c = 'a';
int b = c;
Здесь значение c неявно преобразуется в тип int без использования какого-либо явного оператора. Рассматривается ли это кастинг? или его рассмотренное кастинг, только когда я должен выполнить явное преобразование, как в:
int a = 10;
int b = 5.5;
double sum = double (a) / b;
Я знаю, это может показаться глупым вопросом, но я просто хотел быть уверенным в конверсиях.
"Кастинг" выполняется только при явном преобразовании.
Как говорится, вы найдете этот термин неправильно используемым во всем Интернете и в разных командах!
Как упоминалось в других ответах, броски написаны явно. Стандарт относится к ним как к явным преобразованиям типов; [Expr.cast]/2:
Явное преобразование типа может быть выражено с использованием функциональной нотации (5.2.3), оператор преобразования типа (
dynamic_cast
,static_cast
,reinterpret_cast
,const_cast
) или литой нотации.
Существует три вида выражений, которые мы называем casts, упомянутые в приведенной выше цитате:
(T)expr
. В стандарте эта форма называется литой записью преобразования явного типа и также обычно называется литой C-стиля (так как она является синтаксисом, используемым и унаследованным от C). (double) a
- пример.
T(expr)
. Это функциональная нотация (также называемая литой в стиле функции). Часто используется для создания временных типов класса, например. std::string("Hello World")
. double(a)
- это также функция-стиль.
И последнее, но не менее важное: так называемые операторы преобразования типов static_cast<T>(expr),
reinterpret_cast
, const_cast
и dynamic_cast
. Это самые явные обозначения и индивидуально более ограничены.
Использование всех этих функций описано в этом Q/A.
Каждое другое преобразование не называется литой.
Расширение (сохранение значений) - конверсии, результаты которых при преобразовании обратно в исходный тип дадут исходное значение - обычно выполняются неявно. Это
char c = 'x';
int b = c;
является неявным преобразованием. Явные преобразования называются приведениями.
int a = 1;
double sum = static_cast<double>(a) / b;
Здесь литье a
в double
явно выполняется как как a
, так и b
int
s; без преобразования никакого преобразования не произойдет, что приведет к целочисленному делению, в то время как разделение с плавающей запятой может быть предпочтительным, поскольку оно может быть более точным. Выделение одного из операндов от /
до double
, что приведет к тому, что другое будет неявно преобразовано в double
тоже, и, следовательно, деление (и его результат) теперь будет плавающей точкой.
Если бы вы делали только double x = a;
, вы можете покончить с явным преобразованием, поскольку int
неявно преобразован в double
(живой пример). Из стандарта С++ 11 проект N3337
- если один из операндов является двойным, другой должен быть преобразован в double.
См. здесь для полного списка неявных преобразований.
Кастинг - это явное преобразование переменных в выражение. Как этот
int a = 10;
int b = 5.5;
double sum = double (a) / b;
В то время как этот
char c = 'a';
int b = c;
.. является примером неявного преобразования типов (или иногда принуждения), где типы данных неспецифически продвигаются от одного типа к другому [например, char to int]
Взгляните на эту статью для более глубокого понимания.
Ура!
Это не кастинг, а стандартное преобразование, поскольку состояние n3337 в С++ стандартно в
§ 4 Стандартные преобразования
4.5 Целочисленные акции
1) Prvalue целочисленного типа, отличного от bool, char16_t, char32_t, или wchar_t, чей целочисленный ранг преобразования (4.13) меньше ранга int может быть преобразован в prvalue типа int, если int может представлять все значения типа источника; в противном случае исходное значение может преобразуется в prvalue типа unsigned int.