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

In C++, what are the differences between static_cast<double>(a) and double(a)?

本文关键字:和双 之间 区别 什么 C++ lt double static gt cast      更新时间:2023-10-16

两者有什么区别

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 转换相同的所有缺点:

  • 可以无意中抛弃恒常性
  • 可以无声地变成重新演绎的演员阵容
  • 很难用greping工具区分。

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

后者被称为显式强制转换的功能表示法,您明确表示a应被视为double。 使用此技术,您几乎可以将任何内容转换为任何类型。

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

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.很难找到使用强制转换表示法的表达式。

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

看这里: 类型转换

int a;

//This is the old way of converting a variable from its type to a double
double pi = double(a)/3;
//This is the new way of converting a variable from its type to a double
double pi = static_cast<double>(a)/3;

摘自沃尔特·萨维奇(Walter Savitch)的书,(用CPP解决问题,第10版)第222页