我是否真的每次都想在原始类型之间进行转换时使用static_cast?

时间:2012-07-25 16:17:29

标签: c++ coding-style casting primitive

是什么让这个

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;

何时将一个原始数据类型转换为另一个?

我有很多遗留代码在类似情况下使用第二种样式进行类型转换,所以这也是一个问题,我是否应该对该代码进行全面修订。

5 个答案:

答案 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风格演员表的问题在于它可以让你进行你不想要的转换。

这是你将来应该做的事情,但除非你发现问题,否则我不会回去改变它。