Преобразование типов/литье в С++
Что такое преобразование типов и что такое литье по типу?
Когда я должен использовать каждый из них?
Подробнее: Извините, если это очевидный вопрос; Я новичок в С++, исходя из рубинового фона и использую to_s
и to_i
и т.п.
Ответы
Ответ 1
Конверсия - это когда значение, um, преобразуется в другой тип. Результатом является значение целевого типа, и есть правила для того, какое выходное значение будет результатом ввода (типа источника).
Например:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
В результате значение unsigned int
равно i
по модулю UINT_MAX+1
, и это правило является частью языка. Итак, в этом случае значение (на английском языке) по-прежнему равно "3", но это значение без знака, равное 3, которое существенно отличается от подписанного значения int 3.
Обратите внимание, что преобразование произошло автоматически, мы просто использовали подписанное значение int в позиции, где требуется значение unsigned int, а язык определяет, что это означает, без нас, фактически говоря, что мы конвертируем. Это называется "неявным преобразованием".
" Кастинг" - это явное преобразование.
Например:
unsigned int k = (unsigned int)i;
long l = long(i);
unsigned int m = static_cast<unsigned int>(i);
- все броски. В частности, согласно 5.4/2 стандарта, k
использует выражение-литье, и согласно 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
Ответ 2
Классическое литье (что-то вроде (Bar)foo
в C, используемое в С++ с reinterpret_cast<>
), - это когда фактическое содержимое памяти переменной считается переменной другого типа. Преобразование типа (например, Boost lexical_cast<>
или другие пользовательские функции, которые преобразуют типы), - это когда выполняется какая-либо логика, чтобы фактически преобразовать переменную из одного типа в другой, например целое число в строку, где некоторый код работает, чтобы логически сформировать string из заданного целого числа.
Существует также статическое и динамическое кастинг, которые используются, например, для наследования, для принудительного использования родительских функций-членов дочернего типа (dynamic_cast<>
) или наоборот (static_cast<>
). Статическое литье также позволяет выполнять типичное "неявное" преобразование типа, которое происходит, когда вы делаете что-то вроде:
float f = 3.14;
int i = f; //float converted to int by dropping the fraction
который можно переписать как:
float f = 3.14;
int i = static_cast<int>(f); //same thing
Ответ 3
В С++ любое выражение имеет тип. когда вы используете выражение одного типа (например, тип S) в контексте, где требуется значение другого типа (например, тип D), компилятор пытается преобразовать выражение из типа S в тип D. Если такое неявное преобразование не выполняется 't существует, это приводит к ошибке. Листинг типа слова не является стандартным, но совпадает с преобразованием.
например.
void f(int x){}
char c;
f(c); //c is converted from char to int.
Конверсии ранжируются, и вы можете google для promotions vs. conversions
для более подробной информации.
В С++ static_cast
, const_cast
, reinterpret_cast
и dynamic_cast
имеется 5 явных операторов-литов, а также C-style cast
Ответ 4
Преобразование типов - это когда вы на самом деле конвертируете тип в другой тип, например строку в целое число и наоборот, тип casting - это когда фактическое содержимое памяти не изменяется, но компилятор интерпретирует его в другим способом.
Ответ 5
Тип casting означает, что вы обрабатываете блок памяти по-разному.
int i = 10;
int* ip = &i;
char* cp = reinterpret_cast<char*>(ip);
if ( *cp == 10 ) // Here, you are treating memory that was declared
{ // as int to be char.
}
Преобразование типов означает, что вы конвертируете значение из одного типа в другой.
char c = 'A';
int i = c; // This coverts a char to an int.
// Memory used for c is independent of memory
// used for i.