这些有什么区别:
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
的主要优点是它更加灵活。在某些情况下,它可能相当于一个const_cast
,在另一种情况下,它可能相当于一个static_cast
,在另一种情况下,它可能相当于一个dynamic_cast
,在另一种情况下,它可能是const_cast
和static_cast
(或dynamic_cast
)的组合。xxx_cast<type_id> (cast_expression)
,只需搜索_cast
即可。很难找到使用强制类型转换符号的表达式。整型变量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页:
a
是一个整数类型时,使用static_cast<double>(a)
、(double)a
和double(a)
的语义是相同的。但当变量a
是其他非标量类型或者是const
或volatile
时,它们之间的差异就会显现出来。 - ildjarndouble(a)
编译速度会稍微慢一点(但不重要),因为它首先会尝试匹配const_cast
。 - KillianDS