之间有什么区别
int a;
// a gets some value
double pi = static_cast<double>(a)/3;
和
int a;
// a gets some value
double pi = double(a)/3;
你见过后者吗?在我看来,我在Stroustrup写的一些片段中看到了它,但我找不到参考。
答案 0 :(得分:14)
有人可能认为他们正在建造而不是铸造。考虑:
some_fun(std::string("Hello"));
许多人认为他们在那里调用构造函数,而实际上他们正在进行C风格的演员。事实上,在它看到的其他东西的长列表中,cast会查看目标类型的构造函数,因此它最终会调用构造函数。
功能表示法强制转换与其他类型的C强制转换具有相同的弱点:
除此之外,你在两种情况下都表现出完全相同的操作。
答案 1 :(得分:8)
后者被称为显式投射的功能表示法,您明确指出a
应被视为double
。你可以使用这种技术将任何类型的任何东西投射到任何类型。
前者是在C ++中强制转换类型的首选方法。它执行基本检查以查看您要转换的类型是否有意义(指向基类指针的子类指针等)。此外,与您显示的示例一样,您可以执行隐式转换。从技术上讲,示例中的static_cast
是显式的,但操作的结果(赋值)是隐式的。
答案 2 :(得分:4)
static_cast<double> (a)
和(double) a
之间生成的汇编代码没有区别。演员表示法(type_id) cast_expression
的主要优点是它更灵活。在一种情况下,它可能相当于const_cast
,在另一种情况下,static_cast
,在另一种情况下,dynamic_cast
,在另一种情况下,const_cast
和static_cast
(或dynamic_cast
)。
这种力量也是一个弱点。演员表示法在不同的地方意味着不同的东西。另一个缺点是很容易找到xxx_cast<type_id> (cast_expression)
。只需搜索_cast
即可。很难找到使用强制表示法的表达式。
答案 3 :(得分:2)
使用static_cast是一种安全的C ++风格方式,但是(双重) - 不安全的旧C风格方式。
见这里:Type Casting