zoukankan      html  css  js  c++  java
  • static_cast 和 dynamic_cast

    1.static_cast

    static_cast < type-id > ( expression )

    该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。

    用法:

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

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

    2.dynamic_cast

    dynamic_cast <type-id> (expression)

    将一个基类对象指针(或引用)cast到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。

    该运算符把expression转换成type-id类型的对象。Type-id 必须是类的指针、类的引用或者void*;

    dynamic_cast运算符可以在执行期决定真正的类型。如果 downcast 是安全的(也就说,如果基类指针或者引用确实指向一个派生类对象)这个运算符会传回适当转型过的指针。如果 downcast 不安全,这个运算符会传回空指针(也就是说,基类指针或者引用没有指向一个派生类对象)。

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

    3.static_cast 和 dynamic_cast 的关系

    1. 在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;

    classB
    {
    public:
    int m_iNum;
    virtual void foo();
    };
     
    classD:publicB
    {
    public:
    char* m_szName[100];
    };
     
    void func(B* pb)
    {
    D* pd1=static_cast<D*>(pb);
    D* pd2=dynamic_cast<D*>(pb);
    }
    

     如果 pb 指向一个 D 类型的对象,pd1 和 pd2 是一样的,并且对这两个指针执行 D 类型的任何操作都是安全的;

    2.在类层次间进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。

       如果 pb 指向的是一个 B 类型(基类)的对象,那么 pd1 将是一个指向该对象的指针,对它进行 D 类型的操作将是不安全的(如访问 m_szName),而 pd2 将是一个空指针。

    3. static_cast 是在编译时检查,用于非多态的转换,可以转换指针及其他,比如:int->float。

       dynamic_cast:运行时检查,用于多态的类型转换(upcast,downcast和crosscast),只能转换指针和引用

    int i;
    float f = 166.71;
    i = static_cast<int>(f);
    

     此时结果,i的值为166。

    4. dynamic_cast还支持交叉转换(cross cast)

    classA
    {
    public:
    intm_iNum;
    virtual void f(){}
    };
    class B:public A
    {
    };
    class D:public A
    {
    };
    void foo()
    {
    B*pb=newB;
    pb->m_iNum=100;
    //D*pd1=static_cast<D*>(pb);//compile error
    D*pd2=dynamic_cast<D*>(pb);//pd2isNULL
    delete pb;
    }
    

     在函数foo中,使用static_cast进行转换是不被允许的,将在编译时出错,而使用 dynamic_cast的转换则是允许的,结果是空指针。

  • 相关阅读:
    3月21日软件工程概论课堂测验
    四则运算2
    构建之法阅读笔记01
    软件工程学习进度条02-06
    软件工程个人作业01
    简牍《构建之法》
    2月29日课后作业
    读《大道至简》第七八章有感
    个人冲刺——第十天
    人月神话阅读笔记02
  • 原文地址:https://www.cnblogs.com/zhanghu52030/p/6903656.html
Copyright © 2011-2022 走看看