(C++) 类与 static_cast 与 dynamic_cast

2023-02-12,

static_cast

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

    用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。
    用于基本数据类型之间的转换,如把int转换成char,把int转换成enum。
    把空指针转换成目标类型的空指针。
    把任何类型的表达式转换成void类型。

    注意:static_cast不能转换掉expression的const、volatile、或者__unaligned属性。

dynamic_cast

转换方式:

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

与static_cast对比:

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

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

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

总结

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

参考

c++ static_cast和dynamic_cast详解

(C++) 类与 static_cast 与 dynamic_cast的相关教程结束。

《(C++) 类与 static_cast 与 dynamic_cast.doc》

下载本文的Word格式文档,以方便收藏与打印。