• 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
  • 相关阅读:
    CSS——如何清除浮动
    CSS——display(Block none inline等)属性的用法
    css3——position定位详解
    [转载]mysql创建临时表,将查询结果插入已有表中
    [转载]基于LVS的AAA负载均衡架构实践
    Percona Toolkit 2.2.19 is now available
    [转载]使用awk进行数字计算,保留指定位小数
    [转载]github在线更改mysql表结构工具gh-ost
    [转载]binlog归档
    [转载]MySQL运行状态show status详解
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/13022513.html
Copyright © 2020-2023  润新知