Преобразование типов/литье в С++

Что такое преобразование типов и что такое литье по типу?

Когда я должен использовать каждый из них?

Подробнее: Извините, если это очевидный вопрос; Я новичок в С++, исходя из рубинового фона и использую 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.