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

    1.C语言强制类型转换,Type b = (Type)a,这种不安全,转换前没有类型检查。例如:

      char *pChar = new char;
       int *pInt =  (int *)pChar;

      这种是从小的地址(char *)转换为大的地址(int *),虽然可以编译过,但是有可能访问不安全的地址。

    2.C++提供了四种类型转换,分别适用于其他场景

    (1)static_cast : 用于一般的数据类型转换,和具有继承关系的指针或引用。

    int main()
    {
        int nData1 = 10;
        double dData2 = static_cast<double>(nData1);    
        
        int *pData1 = &nData1;
        double *pData2 = static_cast<double*>(&nData1);  //无关类型转换,编译错误
        void *pData3 = static_cast<void*>(pData2);
    
        system("pause");
        return 0;
    }

    (2)dynamic_cast : 只能转换具有继承关系的指针或引用,但是当转换继承关系的指针时,只能由子类指针转换为父类指针,也就是大地址转换为小地址,否则地址越界。

    class People
    {
    private:
        string mName;
        int mAge;
    };
    
    class Animal
    {
    private:
        int mData1;
    };
    
    class Dog :public Animal
    {
    private:
        int mData2;
    };
    
    
    int main()
    {
        People *pPeo = new People();
        Animal *pAni = dynamic_cast<Animal *>(pPeo);   //没有继承关系,报错
    
        Animal *pAnimal = new Animal();
        Dog *pDog = dynamic_cast<Dog *>(pAnimal);       //父类->子类,内存越界,报错
    
        Dog *pDog = new Dog();
        Animal *pAnimal = dynamic_cast<Dog *>(pDog);       //子类->父类,正确
    
        system("pause");
        return 0;
    }

    (3)const_cast:去掉或添加const,对象必须时引用或者指针类型。

      

    int main()
    {
        int nData1 = 10;
        const int &nData2 = nData1;
        int &nData3 = const_cast<int &>(nData2);
    
        const int& nData4 = const_cast<const int&>(nData1);
    
        system("pause");
        return 0;
    }

    (4)reinterpret_cast:强制类型转换,无关的指针类型转换,但必须是指针

    class People
    {
    private:
        string mName;
        int mAge;
    };
    
    class Animal
    {
    private:
        int mLength;
    };
    
    
    int main()
    {
        People *pPeo = new People();
        Animal *pAni = reinterpret_cast<Animal *>(pPeo);
    
        system("pause");
        return 0;
    }

    总结

    去const属性用const_cast

    基本类型转换用static_cast

    多态类之间的类型转换用dynamic_cast

    不同类型的指针类型转换用reinterpret_cast

    111
  • 相关阅读:
    男人只说三分话、留的七分打天下。
    sqlmap实例拿站
    sqlmap使用笔记
    rpm安装删除简介
    Zookeeper技术介绍
    linux下各文件夹的结构说明及用途介绍:
    每个系统管理员都要知道的 30 个 Linux 系统监控工具
    常用命令
    安装gitlab管理自己的代码
    速成Git
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/13022513.html
Copyright © 2011-2022 走看看