我听说static_cast函数应该优于c风格或简单函数风格的强制转换。这是真的吗?为什么?
当前回答
C样式强制转换在代码块中很容易被忽略。c++风格的类型转换不仅是更好的实践;它们提供了更大程度的灵活性。
Reinterpret_cast允许整型到指针类型的转换,但是如果使用不当可能是不安全的。
Static_cast为数值类型提供了良好的转换,例如从enum到int或从int到float或任何您确定类型的数据类型。它不执行任何运行时检查。
另一方面,Dynamic_cast将执行这些检查,标记任何不明确的赋值或转换。它只对指针和引用起作用,会产生开销。
还有一些其他的,但这些是你会遇到的主要的。
其他回答
这与您希望施加的类型安全性有关。
当你写(bar) foo(如果你没有提供类型转换操作符,这相当于reinterpret_cast<bar> foo)时,你是在告诉编译器忽略类型安全,只做它被告知的事情。
当您编写static_cast<bar> foo时,您是在要求编译器至少检查类型转换是否有意义,并且对于整型类型,要插入一些转换代码。
编辑2014-02-26
这个答案是我5年前写的,但我错了。(见注释)。但它仍然得到了赞!
Static_cast意味着您不能意外地使用const_cast或reinterpret_cast,这是一件好事。
一个实用的提示:如果您计划整理项目,可以在源代码中轻松搜索static_cast关键字。
Static_cast除了操作指向类的指针外,还可以用于执行类中显式定义的转换,以及执行基本类型之间的标准转换:
double d = 3.14159265;
int i = static_cast<int>(d);
C样式强制转换在代码块中很容易被忽略。c++风格的类型转换不仅是更好的实践;它们提供了更大程度的灵活性。
Reinterpret_cast允许整型到指针类型的转换,但是如果使用不当可能是不安全的。
Static_cast为数值类型提供了良好的转换,例如从enum到int或从int到float或任何您确定类型的数据类型。它不执行任何运行时检查。
另一方面,Dynamic_cast将执行这些检查,标记任何不明确的赋值或转换。它只对指针和引用起作用,会产生开销。
还有一些其他的,但这些是你会遇到的主要的。