• C++中reinterpret_cast、const_cast、static_cast、dynamic_cast的作用与区别


    1.reinterpret_cast

    作用及原理:将一个类型的指针,转换为另一个类型的指针,这种转换不用修改指针变量值数据存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以,当然他也可以将指针转换成整型值,但不能做非指针类型转换

     1 #include<iostream>
     2 #include<typeinfo>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     //基本类型指针变换
     9     double d=9.3;
    10     double* pd=&d;
    11     int *pi=reinterpret_cast<int *>(pd);
    12     
    13     //不相关的类的指针的类型转换 
    14     class A{}; 
    15     class B{};
    16     A* pa=new A;
    17     B* pb=reinterpret_cast<B*>(pa);//相当于隐式转换B* pb=(B*)pa; 
    18     
    19     //指针转换成整数
    20     long j=reinterpret_cast<long>(pi);//相当于隐式转换long j=(long)pi; 
    21     
    22     return 0;
    23 }

    2.const_cast

    作用及原理:用于去除指针变量的常量属性,将它转换为一个对应的指针类型的普通变量,当然,也可以将一个非常量的指针变量转换为一个常指针变量。这种转换在编译期间

     1 #include<iostream>
     2 #include<typeinfo>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     const int* pci=0;
     9     int* pj=const_cast<int*>(pci);//相当于隐式转换int* pj=(int*)pci;
    10     
    11     return 0;
    12 }

    3.static_cast

    作用及原理:主要用于基本类型之间和具有继承关系的类型之间的转换

     1 #include<iostream>
     2 #include<typeinfo>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8     //基本类型转换 
     9      int i=0;
    10      double d=static_cast<double>(i);//相当于隐式转换double d=(double) i; 
    11      int j=static_cast<int>(d);//相当于隐式转换int j=(int)d;
    12      
    13      //转换继承类的对象 
    14      class Base{};
    15      class Derived:public Base{};
    16      Derived D;
    17      Base b=static_cast<Base>(D);//将子类对象赋值给父类对象 
    18     
    19     return 0;
    20 }

    4.dynamic_cast

    作用及其原理:dynamic_cast转换是动态转换,这种转换是在运行时进行转换分析,而不是在编译时期进行,这是区别以上三种转化的一处。dynamic_cast只能在继承类对象的指针之间或引用之间进行转换,进行转换时,会根据当前运行对象的运行类型信息(RTTI),判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null指针来检测

     1 #include<iostream>
     2 #include<typeinfo>
     3 
     4 using namespace std;
     5 
     6 int main()
     7 {
     8      class Base{};
     9      class Derived:public Base{};
    10      //子类指针转换为父类指针 
    11      Derived* pd=new Derived;
    12      Base* pc=dynamic_cast<Base*>(pd);
    13      
    14     if(!pc)
    15          cout<<"转换失败"<<endl;
    16     else
    17         cout<<"转换成功"<<endl; 
    18         
    19     //没有继承关系,但被转换的类有虚函数
    20     class A{virtual ~A(){}};//有虚函数
    21     class B{};
    22     
    23     A* pa=new A;
    24     B* pb=dynamic_cast<B*>(pa);
    25     
    26     if(!pb)
    27          cout<<"转换失败"<<endl;
    28     else
    29         cout<<"转换成功"<<endl;  
    30     
    31     return 0;
    32 }

    结果如下:

    没有继承关系的类之间转换,如果被转换的类有虚函数,编译器会通过,但是转换会失败

    总结:

    reinterpret_cast适用于指针转换为另一种指针

    const_cast适用于常指针变量,可以使常指针变量变为非常指针变量

    static_cast主要用于基本类型转换和拥有继承关系变量之间的转换

    dynamic_cast只能在继承对象的指针之间或引用之间进行类型转换

    注意:需要添加头文件#include<typeinfo>

  • 相关阅读:
    global
    myTimer
    SQL SERVER 2008 阻止保存要求重新创建表的更改
    Singleton
    logger
    多线程编写
    如何:设置 Silverlight 应用程序以进行CodeUI自动化测试
    【Android】Application is not installed on your phone
    【转载】sql2005中判读视图、表、存储过程等是否存在的语句
    Windows7(win7)系统重装与破解
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7084296.html
Copyright © 2020-2023  润新知