static_cast <type-id> ( expression )
@breif:将表达式expression从当前类型转换为type-id所指类型。
@remark:没有运行时的类型检查来保证转换的安全性。static_cast操作符可以被用来一把一个指针变量转换为基类型把一个指针变量转换为派生类型。这样的转换并不总是安全。
总之,你可以使用static_cast当你想当你想把数字类型比如enums、int转换为float,并且你对转换的数据类型有把握。static_cast不像dynamic_cast那么安全,因为static_cast不会运行时类型检查,但dynamic_cast会。一个有歧义的或者模糊不清的dynamic_cast转换会失败,但static_cast面对同样的情况会表现的没有错误发生,这很危险。尽管dynamic_cast转换更安全,dynamic_cast只作用于指针或者引用,毕竟运行时的类型检查是一种开销。
// static_cast_Operator.cpp
// compile with: /LD
class
B {};
class
D :
public
B {};
void
f(B* pb, D* pd) {
D* pd2 =
static_cast
<D*>(pb);
// not safe, pb may
// point to just B
B* pb2 =
static_cast
<B*>(pd);
// safe conversion
}
|
与dynamic_cast相比,没有运行时类型检查的转换作用域pb。pb指向的对象可能不是D类型,在有些情况下使用pb2可能是灾难性的。例如,调用一个类B没有但在类D中的函数,会导致访问冲突。dynamic_cast和static_cast将一个指针在类层次上移动。
总结一下static_cast
1.static_cast不进行运行时类型检查,dynamic_cast进行运行时类型检查。
2.static_cast支持隐式转换。
3.使用static_cast转换不会丢失cosnt,volatile或__unaligned属性。
4.使用static_cast请你确认它一定会正确的起效。
5.如果你必须在release模式下用static_cast,请使用safe_cast代替。