什么是类型转换(Type Conversion),什么是类型强制转换(Type Casting)?
何时应该使用它们?
详细信息:如果这是一个明显的问题,我很抱歉;我是C++的新手,来自Ruby背景,并习惯于to_s
和to_i
等等。
什么是类型转换(Type Conversion),什么是类型强制转换(Type Casting)?
何时应该使用它们?
详细信息:如果这是一个明显的问题,我很抱歉;我是C++的新手,来自Ruby背景,并习惯于to_s
和to_i
等等。
转换是将一个值转换为不同类型的过程。结果是目标类型的值,并且有规则来确定源类型的输入对应哪种输出值。
例如:
int i = 3;
unsigned int j;
j = i; // the value of "i" is converted to "unsigned int".
结果是一个无符号整数值,该值等于 i 对 UINT_MAX+1 取模,而这个规则是语言的一部分。所以,在这种情况下,值仍然是 "3",但它是一个无符号整数值为 3,与有符号整数值 3 稍有不同。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
void f(int x){}
char c;
f(c); //c is converted from char to int.
这些转换是有等级的,你可以搜索“促销 vs 转化率”以了解更多细节。
C++中有5个显式类型转换运算符:static_cast
、const_cast
、reinterpret_cast
和dynamic_cast
,还有C风格转换
。
类型转换是指将一个类型转换为另一种类型,例如将字符串转换为整数,反之亦然。而类型转换是指实际内存内容不改变,但编译器以不同的方式解释它。
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.
int i; float f = static_cast<float>(i)
- 按照您的逻辑(我也同意),这是一种转换,而不是一种强制类型转换。C++仍然使用static_cast
(我知道这里可以使用隐式转换)。换句话说,您给出了两个术语最有意义的语义区别。但C++并没有遵循这种区别。 - Konrad Rudolph