几何尺寸与公差论坛

 找回密码
 注册
查看: 1149|回复: 0

【转帖】关于static_cast dynamic_cast reinterpret_cast的使用方法和场合。

[复制链接]
发表于 2009-3-9 09:26:12 | 显示全部楼层 |阅读模式
static_cast就是无条件的转移,无论行不行都转移,所以有潜在危险!   
  dynamic_cast就是有条件转移,只有符合条件才转移类型,所以是在有判定   
  基础上进行的,是安全的做发,Top

5 楼Dreamer7901()回复于 2002-07-25 21:04:04 得分 50

只说一点个人理解,不一定对。   
  reinterpret_cast可以转换任意一个32bit整数,包括所有的指针和整数。可以把任何整数转成指针,也可以把任何指针转成整数,以及把指针转化为任意类型的指针,威力最为强大!但不能将非32bit的实例转成指针。总之,只要是32bit的东东,怎么转都行!   
  static_cast和dynamic_cast可以执行指针到指针的转换,或实例本身到实例本身的转换,但不能在实例和指针之间转换。static_cast只能提供编译时的类型安全,而dynamic_cast可以提供运行时类型安全。举个例子:   
  class   A;class   B:A;class   C。   
  上面三个类A是基类,B继承A,C和AB没有关系。   
  有一个函数void   function(A&a);   
  现在有一个对象是B的实例b,一个C的实例c。   
  function(static_cast<A&>(b)可以通过而function(static<A&>(c))不能通过编译,因为在编译的时候编译器已经知道c和a的类型不符,因此static_cast可以保证安全。   
  下面我们骗一下编译器,先把c转成类型a   
  B&   ref_b   =   reinterpret_cast<B&>c;   
  然后function(static_cast<A&>(ref_b))就通过了!因为从编译器的角度来看,在编译时并不能知道ref_b实际上是c!   
  而function(dynamic_cast<A&>(ref_b))编译时也能过,但在运行时就失败了,因为dynamic_cast在运行时检查了ref_b的实际类型,这样怎么也骗不过去了。   
  在应用多态编程时,当我们无法确定传过来的对象的实际类型时使用dynamic_cast,如果能保证对象的实际类型,用static_cast就可以了。至于reinterpret_cast,我很喜欢,很象C语言那样的暴力转换:)Top

6 楼_Freemanhu(阿人)回复于 2002-07-25 22:01:24 得分 10

dynamic_cast:动态类型转换   
  static_cast:静态类型转换   
  reinterpret_cast:重新解释类型转换   
  const_cast:常量类型转换   
  专业的上面很多了,我说说我自己的理解吧:   
  synamic_cast一般用在父类和子类指针或应用的互相转化;   
  static_cast一般是普通数据类型(如int   m=static_cast<int>(3.14));   
  reinterpret_cast很像c的一般类型转换操作   
  const_cast是把cosnt或volatile属性去掉
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|Archiver|小黑屋|几何尺寸与公差论坛

GMT+8, 2024-5-10 08:52 , Processed in 0.034525 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表