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

原文链接: https://www.cnblogs.com/zwj-199306231519/p/13022513.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++类型转换

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/351944

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 上午7:14
下一篇 2023年3月2日 上午7:14

相关推荐