zoukankan      html  css  js  c++  java
  • C++类型转化

    reinterpret_cast用在任意指针(或引用)类型之间的转化,以及指针与足够大的整数类型之间的转化,从整数类型(包括枚举类型)到指针类型,无视大小。

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

    #include<iostream>
    #include<typeinfo>
    using namespace std;
    
    int main()
    {
        //Basic type pointer conversion
        double d = 9.3;
        double *pd = &d;
        int *pi = reinterpret_cast<int*> (pd);
    
        //irrelated class poniter type conversion
        class A{};
        class B{};
        A* pa = new A;
        B* pb = reinterpret_cast<B*>(pa);
    
        //poniter convertedto integer
        long j = reinterpret_cast<long>(pi);
        
        return 0;
    }

    const_cast 

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

    #include<iostream>
    #include<typeinfo>
    using namespace std;
    
    int main()
    {
        const int* pci = 0;        //常量区的值都是0?
        int *pj = const_cast<int*>(pci);
    
        cout << pj << endl;
        return 0;
    }

    static_cast

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

    #include<iostream>
    #include<typeinfo>
    
    using namespace std;
    
    int main()
    {
        //基本类型转换 
         int i=0;
         double d=static_cast<double>(i);//相当于隐式转换double d=(double) i; 
         int j=static_cast<int>(d);//相当于隐式转换int j=(int)d;
         
         //转换继承类的对象 
         class Base{};
         class Derived:public Base{};
         Derived D;
         Base b=static_cast<Base>(D);//将子类对象赋值给父类对象 
        
        return 0;
    }

    dynamic_cast

    作用及其原理:dynamic_cast转换是动态转换,这种转换是在运行时进行转换分析,而不是在编译时期进行,这是区别以上三种转化的一处。

    dynamic_cast只能在继承类对象的指针之间或引用之间进行转换,进行转换时,会根据当前运行对象的运行类型信息(RTTI),判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null指针来检测。

    #include<iostream>
    #include<typeinfo>
    using namespace std;
    
    int main()
    {
        class Base{};
        class Derived:public Base{};
    
        Derived* pd = new Derived;    //子类指针转化为父类指针
        Base* pc = dynamic_cast<Base*>(pd);
    
        if(!pc)
        {
            cout << "Converted error" << endl;
        }
        else
        {
            cout << "Converted success" << endl;
        }
    
        //没有继承关系,但被转换的类有虚函数
        class A{virtual ~A(){}};    //有虚函数
        class B{};
    
        A* pa = new A;
        B* pb = dynamic_cast<B*>(pa);
    
        if (!pb)
        {
            cout << "Converted error. Incldue virtual" << endl;
        }
        else
        {
            cout << "Converted success. Incldue virtual" << endl;
        }
        
        return 0;
        
    }

    运行结果:

    ubuntu@ubuntu:~/wangqinghe/C++/20200120$ g++ dynamic_cast.cpp -o dynamic_cast

    ubuntu@ubuntu:~/wangqinghe/C++/20200120$ ./dynamic_cast

    Converted success

    Converted error. Incldue virtual

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

    总结:

    reinterpret_cast    适用于指针转换为另一种指针。允许将任何指针类型转换为其他类型。

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

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

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

    主要:头文件包含在#include<typeinfo>中。

  • 相关阅读:
    oracle中去掉文本中的换行符、回车符、制表符
    oracle中的exists和not exists和in用法详解
    将异常(getStackTrace)转化成String
    树的深度优先遍历和广度优先遍历的原理和java实现代码
    extjs4.0 treepanel节点的选中、展开! 数据的重新加载
    揭秘对象
    JVM由浅入深
    语法糖
    Java的技术体系结构
    菜鸟笔记 -- Chapter 09 常见类和接口
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/12213701.html
Copyright © 2011-2022 走看看