Преобразование - это когда значение преобразуется в другой тип.Результатом является значение целевого типа, и существуют правила для того, какое выходное значение получается из какого ввода (типа источника).
Например:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
Результатзначение unsigned int
, равное i
по модулю UINT_MAX+1
, и это правило является частью языка.Таким образом, в этом случае значение (на английском языке) по-прежнему равно «3», но это значение без знака int, равное 3, которое незначительно отличается от значения int со знаком, равного 3.
Обратите внимание, что преобразование произошло автоматически,мы просто использовали значение int со знаком в позиции, где требуется беззнаковое значение int, и язык определяет, что это значит, и мы фактически не говорим, что мы конвертируем.Это называется "неявным преобразованием".
" Casting " является явным преобразованием.
Например:
unsigned int k = (unsigned int)i;
long l = long(i);
unsigned int m = static_cast<unsigned int>(i);
- все приведения.В частности, согласно 5.4 / 2 стандарта, k
использует cast-выражение , а согласно 5.2.3 / 1, l
использует эквивалентную вещь (за исключением того, что я использовалдругой тип).m
использует «оператор преобразования типов» (static_cast
), но другие части стандарта также относятся к «броскам».
Пользовательские типы могут определять «функции преобразования», которые предоставляют определенныеправила для преобразования вашего типа в другой тип, и конструкторы с одним аргументом также используются в преобразованиях:
struct Foo {
int a;
Foo(int b) : a(b) {} // single-arg constructor
Foo(int b, int c) : a(b+c) {} // two-arg constructor
operator float () { return float(a); } // conversion function
};
Foo f(3,4); // two-arg constructor
f = static_cast<Foo>(4); // conversion: single-arg constructor is called
float g = f; // conversion: conversion function is called