• 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
  • 相关阅读:
    POJ 3468 A Simple Problem with Integers
    BZOJ 4430 Guessing Camels
    POJ 2309 BST
    POJ 1990 MooFest
    cf 822B Crossword solving
    cf B. Black Square
    cf 828 A. Restaurant Tables
    Codefroces 822C Hacker, pack your bags!
    [HDU 2255] 奔小康赚大钱
    [BZOJ 1735] Muddy Fields
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/13022513.html
Copyright © 2020-2023  润新知