在C ++中,static_cast <double>(a)和double(a)?</double>之间有什么区别

时间:2012-05-03 19:40:25

标签: c++ casting

之间有什么区别
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写的一些片段中看到了它,但我找不到参考。

4 个答案:

答案 0 :(得分:14)

有人可能认为他们正在建造而不是铸造。考虑:

some_fun(std::string("Hello"));

许多人认为他们在那里调用构造函数,而实际上他们正在进行C风格的演员。事实上,在它看到的其他东西的长列表中,cast会查看目标类型的构造函数,因此它最终会调用构造函数。

功能表示法强制转换与其他类型的C强制转换具有相同的弱点:

  • 可能无意中抛弃了constness
  • 可以默默地变成重新诠释
  • 难以与grepping工具区分开来。

除此之外,你在两种情况下都表现出完全相同的操作。

答案 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_caststatic_cast(或dynamic_cast)。

这种力量也是一个弱点。演员表示法在不同的地方意味着不同的东西。另一个缺点是很容易找到xxx_cast<type_id> (cast_expression)。只需搜索_cast即可。很难找到使用强制表示法的表达式。

答案 3 :(得分:2)

使用static_cast是一种安全的C ++风格方式,但是(双重) - 不安全的旧C风格方式。

见这里:Type Casting