C ++中用于原始值的静态转换样式之间的差异

时间:2014-03-04 18:57:11

标签: c++ casting

假设:

int i = some_int_value();

double d1 = i;
double d2 = (double)i;    
double d3 = double(i);
double d4 = static_cast<double>(i);

这些演员之间有什么区别吗?

如果演员正在缩小(doubleint)而不是扩大会怎么样?

我已经读过C ++应该避免使用C风格的转换,但我不确定这适用于原始值。

6 个答案:

答案 0 :(得分:3)

在这种情况下,它们是等效的。对于所有类型,您都应该更喜欢C ++风格的演员表({{​​1}},static_castreinterpret_castdynamic_cast),无论是否是原始的,因为您想声明您的确切的意图。 C风格的演员阵容比其他人更强大(单独拍摄),因此应该完全避免。

如果您在不允许的地方应用const_cast,编译器会抱怨。如果在相同的情况下应用C风格的强制转换,例如,静默可能会获得具有未定义的运行时行为而不是编译器错误的static_cast

答案 1 :(得分:2)

主要问题是,C风格的演员阵容将执行任何以完成其工作,甚至是不相关类型之间的转换。 static_cast功能有限,所以如果你尝试做任何不能做的事情,你就会收到错误。

你可以说C风格的演员阵容就像reinterpret_cast,除了你不能抛弃像const这样的限定词。

答案 2 :(得分:2)

在这种情况下,这些都是等价的。它们都执行标准转换,特别是浮动积分转换。如果从double转换为int,它们也是等效的。

答案 3 :(得分:1)

double d1 = i;

这将使用隐式转换。

double d2 = (double)i;    
double d3 = double(i);

这些是相同的C风格的显式演员。

double d4 = static_cast<double>(i);

这是C ++风格的显式演员。

从实际角度来看,所有显式演员都会做同样的事情。 static_cast运算符有一些检查以确保强制转换实际上有效(如果强制转换无效,它将无法编译),并且可以更容易地在代码中查找强制转换。如果你想强制转换(即使它是不安全的),你可以使用reinterpret_cast,它会相信你知道你在做什么(在编译时没有错误的无效转换 - 如果你有可能未定义的行为做一些真正的事情。)

答案 4 :(得分:1)

double d1 = i;

如果数据丢失,这将警告您。

double d2 = (double)i;    

这是一个C风格的演员表。 @faranwath是正确的,这就像reinterpret_cast,但如果需要也会做一个const_cast。

double d3 = double(i);

这会使用int参数调用double构造函数,如果数据丢失也会发出警告。

double d4 = static_cast<double>(i);

这会抑制编译器警告,并且很容易在代码中搜索。根据我的口味,这最清楚地表达了你的意图。在除了int-&gt; double之外的其他情况下,例如如果需要const_cast,编译器会提醒您出现错误的问题。这是件好事。

答案 5 :(得分:0)

正如faranwath所说,C风格的演员会做任何事情来完成工作。主要区别在于static_cast是安全的,并告诉编译器你想要做什么,而不是更多。