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>中。

  • 相关阅读:
    知物由学 | 未来安全隐患:AI的软肋——故意欺骗神经网络
    IT和非IT人士:2分钟了解什么是区块链
    追踪掠食者:地下灰产如何撸死创业公司?
    机器学习、深度学习、和AI算法可以在网络安全中做什么?
    一文了解安卓APP逆向分析与保护机制
    如何做好iOS应用安全?这有一把行之有效的“三板斧”
    微服务化不同阶段 Kubernetes 的不同玩法
    从B站、爱奇艺、映客的IPO上市,看国内视频公司的内容审核现状
    知物由学 | 你的网络安全问题背后的真正原因
    感动到流泪!数据分析师的福音:跨视图粒度计算
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/12213701.html
Copyright © 2011-2022 走看看