C++ reinterpret_cast,const_cast等 显式类型转换总结

#include<iostream.h>

int main(void)
{
//reinterpret_cast
//将一个类型指针转换为另一个类型指针,这种在转换不修改指针变量值数据存放格式
//只需在编译时重新解释指针的类型,他可以将指针转化为一个整型数但不能用于非指针的转换
double d=9.3;
double* pd = &d;
int* pi = reinterpret_cast<int *> (pd);
class A{};
class B{};
A* pa = new A;
B* pb=reinterpret_cast<B*>(pa); //将pa 转为B
long j=reinterpret_cast<long> (pa);//指针转换为整数
// int i=9;
// double x=reinterpret_cast<double>(i); //reinterpret_cast不能用于非指针的转换

//const_cast
//1.用于去除指针变量的常属性,将它转换为一个对应指针类型的普通变量,
//2.反过来也可以将一个非常量指针转换为一个常量指针变量
//3.他无法将一个非指针的常量转换为普通变量
//example: const i=10;
//         int j=const_cast<int>(i); //无法转换
const int ppp=998;

    const int* pca=&ppp;
int* p=const_cast<int*>(pca);//将它转换为一个对应指针类型的普通变量,去除了const;

const A* paa=new A;
A * ppppa=const_cast<A*> (paa);//它转换为一个对应指针类型的普通变量,去除了const;

int * pii=0;//反过来也可以将一个非常量指针转换为一个常量指针变量
const int* piiic=const_cast<const int *>(pii);
//

//static_cast
//用于转换基本类型和具有继承关系的类新之间转换
//static_cast不太用于指针类型的之间的转换,他的效率没有reinterpret_cast的效率高

int in=99;
double dn=static_cast<double> (in);//用于转换基本类型和具有继承关系的类新之间转换

class Base{};
class derv:public Base{};
derv dd;
Base bbbb=static_cast<Base>(dd);//具有继承关系的类型之间转换
    
//static_cast不太用于指针类型的之间的转换,他的效率没有reinterpret_cast的效率高
Base *pb1=new Base;
derv *pder=static_cast<derv*>(pb1);//基类转继承类
derv* pder1=new derv;
Base* pbase1=static_cast<Base*>(pder1);//继承类指针转父类指针
//

//dynamic_cast
//1.只能在继承类对象的指针之间或引用之间进行类型转换
//2.这种转换并非在编译时,而是在运行时,动态的
//3.没有继承关系,但被转换的类具有虚函数对象的指针进行转换
derv* dp=new derv;
Base* bv=dynamic_cast<Base *>(dp);//继承类对象的指针之间进行类型转换

derv dpp;//继承类对象引用之间进行类型转换
Base &b=dynamic_cast<Base&>(dpp);

class AA{virtual fun(){}
virtual ~AA(){}};
class BB{};

//没有继承关系,但被转换的类具有虚函数对象的指针进行转换,编译可通过
AA* pAA=new AA;
BB* pBB=dynamic_cast<BB *>(pAA);

//没有继承关系,被转换的类也没有有虚函数对象的指针进行转换,编译不能通过
BB* pBBB=new BB;
AA* pAAA=dynamic_cast<AA*>(pBBB);



return 1;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值