`
shake863
  • 浏览: 661188 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dynamic_cast、static_cast、const_cast 和 reinterp

阅读更多

dynamic_cast、static_cast、const_cast   和   reinterpret_cast  
   
  一、dynamic_cast:  
  用法:  
  dynamic_cast<type-id>   (expression).将expression转化为具有type-id型的指针。type-id必须是一个  
  指针、引用(一个已经定义的类)或者void指针。如果是个指针,expression也必须是个指针或者引用。  
   
    a.   如果type-id是expression的直接或间接基类指针,结果将是指向该expression实体的type-id类型指  
   
  针。这称作"upcast"。比如:  
        class   B   {...};  
        class   C   :   public   B   {...};  
        class   D   :   public   C   {...};  
   
  void   f   (D   *pD)  
  {  
  C*   pc   =   dynamic_cast<C*>(pD);       //   ok  
  B*   pb   =   dynamic_cast<B*>(pD);       //   ok  
  }  
    b.如果type-id   是void   *,那么运行时将   检查expression的实际类型。其结果是指向expression完整实  
   
  体的一个指针。  
  如:  
  class   A   {   ...   };  
   
  class   B   {   ...   };  
   
  void   f()  
  {  
        A*   pa   =   new   A;  
        B*   pb   =   new   B;  
        void*   pv   =   dynamic_cast<void*>(pa);  
        //   pv指向A一个对象  
        ...  
        pv   =   dynamic_cast<void*>(pb);  
        //   pv   指向   B的一个对象  
  }  
   
    c.如果type-id不是void   *,将在运行时检查expression对象是否可以被转型为type-id.  
        c-1.如果   expression是type-id的一个基类,那么将在运行时检查   expression是否指向type-id一个  
   
  完整对象。如果是,结果就是该对象的指针。否则出错  
      如:  
  class   B   {...};  
  class   D   :   public   B   {...};  
  void   f()  
  {  
  B   *pB   =   new   D;  
  B   *pB2   =   new   B;  
   
  D   *pD   =   dynamic_cast<D*>   (pB); //   ok.  
  D   *pD2   =   dynamic_cast<D*>   (pB2)   //   error.  
  }  
  上面称作"downcast"  
      c-2.如果是多重继承.比如:  
   
  class   A   {...};  
  class   B   :   public   A   {...}; //   B继承自A  
  class   C   :   public   A   {...}; //   C继承自A  
  class   D   :   public   B,   public   C   {...}; //   D继承自B,   C  
  此时指向D的指针可以   安全   的cast为B或者C(见上).不过如果将其cast到A该怎么办呢?  
  这样吗?  
  D   *pD   =   new   D;  
  A   *pA   =   dynamic_cast   <A*>   (pD); //error.不知道指向哪个A.  
  这时我们可以先转型为B(或C),然后间接批向A。如下  
  B   *pB   =   dynamic_cast   <B*>   (pD);  
  A   *pA   =   dynamic_cast   <A*>   (pB);   //   ok  
   
      c-3.虚拟继承的情况.  
  class   A   {...}   //   以后就直接简写作class   name了  
  class   B   :   vitual   public   A;  
  class   C   :   public   B;  
  class   D   :   public   B;  
  class   E   :   publc   C,   public   D;  
  如果E的实体或者A的子对象想要转型为   B将会是失败的(原因见上).这时你需要先转型为一个完整的E对象  
   
  ,然后逐层进行明确的转型操作。  
   
      c-4.  
  class   A;  
  class   B   :   public   A;  
  class   C   :   public   A;  
  class   D;  
  class   E   :   public   B,   public   C,   publc   D;  
   
  假如E的一个对象和D子对象的一个指针,想要从D的子对象中得到A的子对象,需要三个转换。  
  先将D类型的指针转型为E型的一个指针,然后再逐层转型到A。  
  如  
  void   f   (D   *pD)  
  {  
  E   *pE   =   dynamic_cast   <E*>   (pD);  
  B   *pB   =   dynamic_cast   <B*>   (pE);  
  //   或者   B   *pB   =   pe;  
  A   *pA   =   dynamic_cast   <A*>   (pB);  
  //   or   A   *pA   =   pB;  
  }  
      c-5.   (十字)交叉转换(cross   cast)。  
          如上例中从   B   (或子类)   与   D   (或子类)的互相转型。  
   
  二、static_cast  
      关于static_cast   不想说太多。它将expression类型转型为type-id类型。可以是类(包括继承)的转型  
   
  ,也可以是普通类型的转型(如int   ->   float).   请注意,它运行时   不做类型检查,因而可能是不安全的  
   
  。比如将   基类     转型   为   派生类指针。  
   
  三、const_cast  
        简单的说,其作用就是将一个类的   const、volatile以及__unaligned属性去掉。  
  四、reinterpret_cast  
        简单的说,就是任意的类型转换。但是它没有const_cast的功效。  
  注意,   A   ->   B   ->   A,这未必是安全的。另,它将null   指针   转换为   null指针。 

分享到:
评论

相关推荐

    例说 const_cast,reinterpret_cast,static_cast,dynamic_cast代码.rar

    本资源“例说 const_cast,reinterpret_cast,static_cast,dynamic_cast代码.rar”聚焦于四种主要的C++类型转换:const_cast、reinterpret_cast、static_cast和dynamic_cast。这四个关键字都是为了安全和高效地在...

    标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

    ### 标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast 在C++编程语言中,为了提高程序的可读性和安全性,C++标准库提供了多种类型的转换机制。其中,最常用的四种类型转换符包括:`...

    类型强制转换的区别(static_cast、dynamic_cast的区别)

    C++提供了多种类型转换的方式,包括`static_cast`、`dynamic_cast`等,每种方式都有其特定的应用场景和特点。本文将重点介绍`static_cast`与`dynamic_cast`之间的区别及其应用场景。 #### `static_cast` `static_...

    static_cast、dynamic_cast、reinterpret_cast和const_cast

    标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast

    C++中的类型转换static_cast、dynamic_cast、const_cast和reinterpret_cast总结

    本文将详细介绍四种主要的显式类型转换:`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`。 首先,`static_cast`主要用于非多态类型的转换,它不提供运行时的类型检查。例如,当进行基类与子类...

    C++中4种强制类型转换的区别总结

    使用标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast。 const_cast,字面上理解就是去const属性。 static_cast,命名上理解是静态类型转换。如int转换成char。 dynamic_cast,...

    static_cast,dynamic_cast,reinterpret_cast,const_cast的区别及用法详解

    1.static_cast对类的指针只能转换有继承关系的类。对普通的指针来说只能在void*和其他指针之间转换。它还可转换简单的类型,比如int到char等。不能提供数字到指针的转换。不能提供不同类型指针之间的转换比如int*到...

    static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解

    然而,C-style类型转换存在潜在的风险,因此,C++引入了四个新的类型转换关键字:`static_cast`、`dynamic_cast`、`reinterpret_cast`和`const_cast`,以提供更精确和安全的转换控制。下面是这些关键字的详细解释: ...

    C++中的类型转换

    本文将详细介绍C++中的四种显式类型转换:static_cast、dynamic_cast、const_cast和reinterpret_cast。 1. static_cast static_cast是一种静态类型转换,用于非多态类型之间的转换,不提供运行时的检查来确保转换...

    C++的cast强制类型转换

    C++提供了多种类型转换方式,包括`static_cast`、`dynamic_cast`、`const_cast`以及`reinterpret_cast`。本文将重点探讨`dynamic_cast`的使用方法、注意事项及其与其他类型转换符的对比,旨在为读者提供全面而深入的...

    浅谈C++中强制类型转换函数

    C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用,即const_cast、static_cast、dynamic_cast和reinterpret_cast。 const_cast是用于去掉类型的const或volatile属性的操作符。它常用于指针或引用,...

    类型转换操作符:static_cast,dynamic_cast,const_cast,reinterpret_cast.

    特别是在指针转换和数值转换时用到的非常多。只要编写程序的人知道自己要做什么转换,并知道应该怎样转换的话,我认为上边的转换方式非常之好。但是没有清楚的了解每个转换的细节的话,就有可能

    C++显式类型转换[借鉴].pdf

    C++ 提供了四个显式的数据类型转换函数:reinterpret_cast、const_cast、static_cast 和 dynamic_cast。这些转换函数可以在编译期间或运行期间实现数据类型的转换。 1.reinterpret_cast reinterpret_cast 是一种低...

    C++ 中的强制类型转换

    C++提供了四种显示的强制类型转换操作符,分别是`const_cast`、`static_cast`、`dynamic_cast`和`reinterpret_cast`。 1. `const_cast`: `const_cast`主要用于移除对象的`const`或`volatile`属性,允许程序员修改...

    C++类型转换(英文讲解,参考实例)

    我们探讨了C风格类型转换和C++风格类型转换的区别,并详细解释了`static_cast`、`const_cast`、`dynamic_cast`和`reinterpret_cast`这四种C++类型转换操作符的功能和用法。理解并正确使用这些类型转换操作符是提高...

    C++四种cast操作符的区别[文].pdf

    C++标准定义了四种cast操作符,它们分别是C风格转换、`static_cast`、`dynamic_cast`和`const_cast`,每种都有其特定的用途和限制。以下是这四种类型转换操作符的详细说明: 1. C风格转换: C++中的C风格转换是一...

    [C++][Casting] C++ 四种 cast使用

    本篇文章将深入探讨C++中的四种cast操作,它们分别是:`static_cast`、`dynamic_cast`、`const_cast`和`reinterpret_cast`。这四种cast方式各自有着特定的用途,下面我们将逐一解析。 首先,`static_cast`是最常用...

Global site tag (gtag.js) - Google Analytics