34

之间有什么区别

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

4 回答 4

22

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

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

许多人认为他们在那里调用了构造函数,而实际上他们正在执行 C 风格的转换。碰巧的是,强制转换将在它查看的一长串其他事物中查看目标类型的构造函数,因此在这里它最终会调用构造函数。

功能符号转换与其他类型的 C 转换具有所有相同的弱点:

  • 可以不经意间抛弃 constness
  • 可以默默地变成重新诠释的演员
  • 很难用 grepping 工具区分。

除此之外,您在两种情况下都执行完全相同的操作。

于 2012-05-03T20:07:47.793 回答
10

后者被称为显式转换的功能符号,您明确地说应该被视为. 您几乎可以使用这种技术将任何内容转换为任何类型。adouble

前者是在 C++ 中强制转换类型的首选方式。它会进行基本检查以查看您要转换的类型是否有意义(指向基类指针的子类指针等)。此外,就像您展示的示例一样,您可以执行隐式转换。从技术上讲static_cast,您的示例中的 是显式的,但操作(分配)的结果是隐式的。

于 2012-05-03T19:45:28.740 回答
6

static_cast<double> (a)和之间生成的汇编代码没有区别(double) a。强制转换符号 , 的主要优点(type_id) cast_expression是它更灵活。在一种情况下,它可能等价于 a const_cast,在另static_cast一种情况下,在另一种情况下,在另一种情况下,在另一种情况下,在另一种情况下,和(或)dynamic_cast的组合。const_caststatic_castdynamic_cast

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

于 2012-05-03T20:12:55.420 回答
2

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

看这里:类型转换

于 2012-05-03T19:44:01.440 回答