假设:
int i = some_int_value();
double d1 = i;
double d2 = (double)i;
double d3 = double(i);
double d4 = static_cast<double>(i);
这些演员之间有什么区别吗?
如果演员正在缩小(double
到int
)而不是扩大会怎么样?
我已经读过C ++应该避免使用C风格的转换,但我不确定这适用于原始值。
答案 0 :(得分:3)
在这种情况下,它们是等效的。对于所有类型,您都应该更喜欢C ++风格的演员表({{1}},static_cast
,reinterpret_cast
和dynamic_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是安全的,并告诉编译器你想要做什么,而不是更多。