(C++) 类与 static_cast 与 dynamic_cast
  TcI6XFEQbses 2023年11月02日 37 0
C++

static_cast

static_cast相当于C语言里面的强制转换,适用于:

  1. 用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
  2. 用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。
  3. 把空指针转换成目标类型的空指针。
  4. 把任何类型的表达式转换成void类型。
    注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。

dynamic_cast

转换方式:

  1. dynamic_cast< type* >(e) type必须是一个类类型且必须是一个有效的指针
  2. dynamic_cast< type& >(e) type必须是一个类类型且必须是一个左值
  3. dynamic_cast< type&& >(e) type必须是一个类类型且必须是一个右值

与static_cast对比:

  1. 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;
  2. 在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

如果一条dynamic_cast语句的转换目标是指针类型并且失败了,则结果为0。如果转换目标是引用类型并且失败了,则dynamic_cast运算符将抛出一个std::bad_cast异常(该异常定义在typeinfo标准库头文件中)。e也可以是一个空指针,结果是所需类型的空指针。

dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast)。

总结

  1. static_cast 父类转子类,不能保证安全;
  2. dynamic_cast 父类转子类,进行转换检查(结果为0,或者抛出异常),转换耗时;

参考

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  8Tw5Riv1mGFK   2024年05月01日   81   0   0 C++
  BYaHC1OPAeY4   2024年05月08日   58   0   0 C++
  yZdUbUDB8h5t   2024年05月05日   44   0   0 C++
  oXKBKZoQY2lx   2024年05月17日   61   0   0 C++
TcI6XFEQbses