Преобразование типов / Путаница в C ++ - PullRequest
12 голосов
/ 02 декабря 2010

Что такое Преобразование типов и что такое Приведение типов ?

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

Подробности: Извините, если это очевидный вопрос; Я новичок в C ++, пришел из рубинового фона и привык к to_s и to_i и т. П.

Ответы [ 5 ]

16 голосов
/ 02 декабря 2010

Преобразование - это когда значение преобразуется в другой тип.Результатом является значение целевого типа, и существуют правила для того, какое выходное значение получается из какого ввода (типа источника).

Например:

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
3 голосов
/ 02 декабря 2010

Классическое приведение (что-то вроде (Bar)foo в C, используется в C ++ с reinterpret_cast<>) - это когда предполагается, что фактическое содержимое переменной в памяти является переменной другого типа.Преобразование типов (т. Е. Boost's lexical_cast<> или другие пользовательские функции, которые преобразуют типы) - это когда некоторая логика выполняется для преобразования переменной из одного типа в другой, например, целое число в строку, где некоторыекод запускается для логического формирования строки из заданного целого числа.

Существует также статическое и динамическое приведение, которые используются, например, в наследовании, чтобы принудительно использовать функции-члены родителя для дочернего типа (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
2 голосов
/ 02 декабря 2010

Преобразование типов - это когда вы на самом деле конвертируете тип в другой тип, например строку в целое число, и наоборот, приведение типа - это когда фактическое содержимое памяти не изменяется, но компилятор интерпретирует его какпо-другому.

2 голосов
/ 02 декабря 2010

В C ++ любое выражение имеет тип.когда вы используете выражение одного типа (скажем, типа S) в контексте, где требуется значение другого типа (скажем, типа D), компилятор пытается преобразовать выражение из типа S в тип D. Если такое неявное преобразование нене существует, это приводит к ошибке.Приведение типа слова не является стандартным, но оно совпадает с конверсией.

EG

void f(int x){}

char c; 

f(c); //c is converted from char to int.

Преобразования ранжируются, и вы можете поискать Google promotions vs. conversions для получения дополнительной информации.1008 * В C ++ static_cast, const_cast, reinterpret_cast и dynamic_cast есть 5 явных операторов приведения, а также C-style cast

1 голос
/ 04 декабря 2016

Тип приведения означает, что вы обрабатываете блок памяти по-другому.

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.
...