是什么让这个
long l = 1;
char c = static_cast<char>(l);
float f = 1.0f;
int i = static_cast<int>(f);
比这更好
long l = 1;
char c = (char)l;
float f = 1.0f;
int i = (int)f;
何时将一个原始数据类型转换为另一个?
我有很多遗留代码在类似情况下使用第二种样式进行类型转换,所以这也是一个问题,我是否应该对该代码进行全面修订。
答案 0 :(得分:23)
未来打样。
让我们说将来我会这样做:
float blah = 1.0f;
float* f = &blah;
现在,int i = static_cast<int>(f);
停止了编译,但int i = (int)f;
执行reinterpret_cast
。
static_cast<int>
这正是我想要你做的。 (int)
做任何你能做到的事情。对于后者,编译器会尽力让你获得int
值,这很少(从不?)是可取的。
答案 1 :(得分:8)
每次都有一点迹象。
你不应该经常在原始类型之间进行转换,因此每次输入一些额外的字符是一项过于繁重的任务。这有点像抱怨每次做一些危险的活动时都要戴头盔。如果你发现戴头盔太烦人了,问题可能是你经常从事危险活动而不是头盔要求。
至于解决遗留代码,您可以查看this question以获取一些答案(包括我自己的答案)。
答案 2 :(得分:6)
是的,你应该。
演员阵容是错误的主要来源。它们是类型系统的方法,它是程序员可以使用的最好的错误捕获程序之一。
与旧的C风格演员相比,static_cast更加明显且更具体。你希望他们脱颖而出。在调试时,您希望它们显而易见。你希望下一个程序员能够理解你为什么要这样做。
键入static_cast<blah>(foo)
更难的事实也是一个好处,因为它会鼓励你只在绝对必要的情况下施放。
答案 3 :(得分:2)
构造函数强制转换是另一种选择。假设定义了转换构造函数。例如:
int i(0);
float f(3.14F);
i = int(f);
然而你绝对应该更喜欢static_cast
和其他C ++演员而不是C风格演员,因为那些人基本上会说“尝试每次演员直到有效”,这最终会达到相当于reinterpret_cast
的可能性给你不正确的行为。
答案 4 :(得分:1)
C风格演员表的问题在于它可以让你进行你不想要的转换。
这是你将来应该做的事情,但除非你发现问题,否则我不会回去改变它。