9

是什么让这

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;

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

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

4

5 回答 5

25

面向未来。

假设将来我这样做:

float blah = 1.0f;
float* f = &blah;

现在,int i = static_cast<int>(f);停止编译,但int i = (int)f;执行reinterpret_cast.

static_cast<int>这正是我要你做的(int)尽你所能给我一个 int。对于后者,编译器会竭尽全力为您获取一个int值,而这很少(永远不会?)可取。

于 2012-07-25T16:20:41.137 回答
8

一次都是一个迹象。

您不应该经常在原始类型之间进行转换,以至于每次输入一些额外的字符是一项过于繁重的任务。这有点像抱怨每次进行危险活动时都必须戴头盔。如果您发现戴头盔太烦人,则问题可能是您过于频繁地从事危险活动,而不是头盔要求。

至于解决遗留代码,您可以查看这个问题以获得一些答案(包括我自己的)。

于 2012-07-25T16:35:18.960 回答
7

是的你应该。

演员表是错误的主要来源。它们是围绕类型系统的方法,类型系统是程序员可用的最好的错误捕获器之一。

static_cast比旧的 c 样式转换更明显、更具体。你想让他们脱颖而出。您希望它们在调试时显而易见。你希望下一个程序员来了解你为什么这样做。

更难键入的事实static_cast<blah>(foo)也是一个好处,因为它会鼓励您仅在绝对必要时进行投射。

于 2012-07-25T16:22:33.827 回答
3

构造函数强制转换是一种替代方法。假设定义了一个转换构造函数。例如:

int i(0);
float f(3.14F);
i = int(f);

但是,您绝对应该更喜欢static_cast其他 C++ 转换而不是 C 样式转换,因为那些基本上说“尝试每次转换,直到某些东西起作用”最终会达到相当于 areinterpret_cast并且可能会给您带来不正确的行为。

于 2012-07-25T16:36:25.313 回答
1

C-style casts 的问题是它可能让你做你不想要的转换。

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

于 2012-07-25T16:19:38.953 回答