之间有什么区别
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 编写的一些片段中看到了它,但我找不到参考。
有人可能认为他们是在构建而不是铸造。考虑:
some_fun(std::string("Hello"));
许多人认为他们在那里调用了构造函数,而实际上他们正在执行 C 风格的转换。碰巧的是,强制转换将在它查看的一长串其他事物中查看目标类型的构造函数,因此在这里它最终会调用构造函数。
功能符号转换与其他类型的 C 转换具有所有相同的弱点:
除此之外,您在两种情况下都执行完全相同的操作。
后者被称为显式转换的功能符号,您明确地说应该被视为. 您几乎可以使用这种技术将任何内容转换为任何类型。a
double
前者是在 C++ 中强制转换类型的首选方式。它会进行基本检查以查看您要转换的类型是否有意义(指向基类指针的子类指针等)。此外,就像您展示的示例一样,您可以执行隐式转换。从技术上讲static_cast
,您的示例中的 是显式的,但操作(分配)的结果是隐式的。
static_cast<double> (a)
和之间生成的汇编代码没有区别(double) a
。强制转换符号 , 的主要优点(type_id) cast_expression
是它更灵活。在一种情况下,它可能等价于 a const_cast
,在另static_cast
一种情况下,在另一种情况下,在另一种情况下,在另一种情况下,在另一种情况下,和(或)dynamic_cast
的组合。const_cast
static_cast
dynamic_cast
这种力量也是一种弱点。演员表在不同的地方意味着不同的东西。另一个缺点是很容易找到xxx_cast<type_id> (cast_expression)
。只需搜索_cast
. 很难找到使用强制转换符号的表达式。
使用 static_cast 是一种安全的 C++ 风格的方式,但是 (double) - 不安全的旧 C 风格的方式。
看这里:类型转换