马上加入,结交更多好友,共享更多资料,让你轻松玩转电力研学社区!
您需要 登录 才可以下载或查看,没有账号?立即加入
×
C++转换操作符ISO-C++中有四种转换操作符dynamic_cast: 在多态类型转换时使用,实现在运行时,并进行运行时检测,如果转换失败,返回值是NULL
9 f5 X! Z& W% X# T! A7 _4 T- R# K' `3 Z" E
static_cast:与dynamic_cast相反,static_cast是在编译时转换类型的,故称为static_cast,它可以用在值类型转换中9 g3 w5 ~! F& p7 l5 D
1 v: U# O- t$ u3 e4 ?. t& r8 o3 n3 Rconst_cast:一般用于去除const, volatile等修饰属性上.
8 u6 L6 D, N/ ~) J5 q' y. @' e& f% _4 i" X* q
reinterpret_cast:这个很厉害,几乎可以在任意类型间转换,reinterpret的中文意思是重新解释 在Visual C++ 2005及以后版本中C++/clr又添加了一个新的转换safe_cast:用于在托管类型间进行转换,如果不成功会抛出InvalidCastException. 关于C风格的类型转换 型如(type-name)value的转换是C风格的类型转换,这种转换对任意类型的都能使用。/ {8 N3 E/ x1 w" h) Q3 P! N
G4 h" p9 n$ b) o0 Z' o% y! E* @
一般而言C风格的类型转换可以替代static_cast,const_cast,reinterpret_cast,safe_cast, 但是一般不能替代dynamic_cast。; V6 Q0 G# {0 D% O9 Z
0 D; X& E6 B+ \$ Z/ P6 X0 r6 @
原因在于,C风格的类型转换是编译时的,对于C语言中各个不同的类型,编译成汇编代码时,这些类型信息会丢失掉,所剩下的是其长度和符号信息,而C风格的转换就是把这些长度和符号信息统一起来。 如对于两个指针间转换而言A* pa=(A*)pb,所生成的中间代码则会是 mov eax, [pb]; mov [pa],eax。
4 o3 x, n& x( k; V6 W
5 V" v4 Y3 z/ n" f4 u E 而dynamic_cast则是会进行运行时检查,对于下行转换(从基类到子类)而言所生成的中间代码一定会调用一个函数名类似 ___RTDynamicCast的转换函数。
/ Z7 r' g) W3 Q/ K) o# }
9 f, T c, f7 t. W" s7 \static_cast,const_cast,reinterpret_cast所起的作用同C风格的类型转换,只是编译时对其类型约束不同而已。
1 d/ v: R4 I( r+ M* Z' h$ n5 b3 f9 b* {; ?# J+ J" A# L" Q
safe_cast是C++/Clr中新增的关键词(Microsoft Specific),对托管类型进行C风格类型转换时, 编译器会自动使用safe_cast进行转换,这一点估计是为了和C#风格一致。 |