在传统的C语言中,可以这样做:
int i = 48;
char c = (char)i;
//Now c holds the value of 48.
//(Of course if i > 255 then c will not hold the same value as i).
在这种情况下,哪种c++强制转换方法(static_cast、reinterpret_cast)更适合完成这项工作?
您可以在数字类型之间进行隐式转换,即使这会失去精度:
char c = i;
然而,您可能希望启用编译器警告以避免类似于此的可能有损失的转换。如果是这样,请使用 static_cast
进行转换。
关于其他类型的转换:
dynamic_cast
仅适用于指向多态类类型的指针或引用;const_cast
不能更改类型,只能更改 const
或 volatile
限定符;reinterpret_cast
用于特殊情况,将指针或引用与完全不相关的类型进行转换。具体来说,它不会进行数字转换。static_cast
、const_cast
和 reinterpret_cast
来完成任务。char c = static_cast<char>(i);
- kayleeFrye_onDeck您应该使用 static_cast<char>(i)
将整数 i
强制转换为字符 char
。
reinterpret_cast
几乎永远不应该使用,除非您想将一个类型转换为根本不同的类型。
此外,reinterpret_cast
是与机器相关的,因此安全地使用它需要完全了解类型以及编译器如何实现转换。
有关C++转换的更多信息,请参见:
char c = '0'
... - Useless48
相同,假设使用ASCII编码。我对硬编码ASCII整数值过敏,因为字符文字本来更易读。 - Uselessreinterpret_cast
根本无法在整数类型之间进行转换;因此,你是否应该使用它是无关紧要的。 - Mike Seymour使用静态转换可能会得到类似这样的结果:
// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);
const char char_max = (char)(((unsigned char) char(-1)) / 2);
int i = 128;
char c = (i & char_max); // Would always result in positive signed values.
在编程中,reinterpret_cast 可能会直接转换为 char,而没有任何类型安全性。 -> 如果可以使用 static_cast,则永远不要使用 reinterpret_cast。 如果你在类之间进行转换,static_cast 也会确保两个类型匹配(对象是转换类型的派生类)。
如果你的对象是多态类型,并且你不知道它是哪一个类型,那么应该使用 dynamic_cast,在运行时执行类型检查,如果类型不匹配则返回 nullptr。
如果你需要 const_cast,那么你很可能做错了什么,应该考虑可能的替代方案来修复代码中的 const 正确性。
char c = i;
而不必担心哪个转换是哪个。当然,如果你这样做,你会遭到“到处转换”的人们的反对,他们坚持将编译器警告转化为错误,并在出现问题时进行修复。 - Pete Becker