什么是类型转换以及什么是类型转换?
我什么时候应该使用它们?
细节:对不起,如果这是一个明显的问题;我是C ++的新手,来自红宝石背景,习惯于to_s
和to_i
等。
答案 0 :(得分:16)
转化是指将某个值转换为其他类型的值。结果是目标类型的值,并且有什么输出值由(源类型的)输入产生的规则。
例如:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
结果是unsigned int
值等于i
modulo UINT_MAX+1
,此规则是该语言的一部分。因此,在这种情况下,值(英文)仍为“3”,但它是无符号的int值3,与有符号的int值3略有不同。
请注意,转换是自动发生的,我们只是在需要unsigned int值的位置使用了signed int值,并且语言定义了这意味着什么,而我们实际上并没有说我们正在转换。这被称为“隐式转换”。
“投射”是一种明确的转化。
例如:
unsigned int k = (unsigned int)i;
long l = long(i);
unsigned int m = static_cast<unsigned int>(i);
都是演员表。具体来说,根据标准的5.4 / 2,k
使用 cast-expression ,根据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
答案 1 :(得分:3)
经典转换(类似于C中的(Bar)foo
,在C ++中使用reinterpret_cast<>
)是假定变量的实际内存内容是不同类型的变量。类型转换(即Boost的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 :(得分:2)
在C ++中,任何表达式都有一个类型。当你在需要另一种类型的值的上下文中使用一种类型的表达式(比如类型S)时(例如类型D),编译器会尝试将表达式从类型S转换为类型D.如果这样的隐式转换没有不存在,这会导致错误。单词类型转换不是标准的,但与转换相同。
E.G。
void f(int x){}
char c;
f(c); //c is converted from char to int.
对转化进行了排名,您可以在promotions vs. conversions
进行谷歌搜索以获取更多详细信息。
C ++中有5个显式强制转换运算符static_cast
,const_cast
,reinterpret_cast
和dynamic_cast
,以及C-style cast
答案 3 :(得分:2)
类型转换是指您实际转换另一种类型的类型,例如将字符串转换为整数,反之亦然,类型转换是指内存的实际内容未更改,但编译器将其解释为另一种方式。