c++的四种类型转换

一、reinterpret_cast:  是特意用于底层的强制转型,导致实现依赖(implementation-dependent)(不可移植)的结果,

这种转换不用于修改指针变量值数据存放的格式(不改变指针变量值),只需在编译期间重新解释指针的类型就可以做到。并不会改变指针的类型,只是为了编译通过。而且仅限于指针的操作。

例如,将一个指针转型为一个整数。             

 string a;
 double *b=static_cast<double*>(&a);
 cout<<b<<" "<<&a<<endl;  //结果只是指针到指针(地址)的拷贝,b和&a地址一样 

            

还有一些自己定义的对象,等只要是数据差异大均可..
 class A {};
 class B {};
 A * a = new A;
 B * b = reinterpret_cast<B *>(a);
 cout<<a<<b<<endl;               //结果地址一样       

                                                          

二、static_cast :可以被用于强制隐型转换(例如,non-const 对象转型为 const 对象,int 转型double,等),它还可以用于很多这样的转换的反向转换(例如,void* 指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个 const 对象转型为 non-const 对象(只有 const_cast 能做到),它最接近于C-style的转换。
 class Base {};
 class Derived : public Base {};
 Base *a = new Base;
 Derived *b = reinterpret_cast<Derived *>(a);   (转换子类到父类,相反也可.)
 //上面程序也可用reinterpret_cast类型转换,因为属两个不同类.数据类型差异大
 

static_cast除了操作指针外,也可以操作数据,类似以前简单类型转换

,如
     double a=1.111;
     int b=static_cast<int>(a);

 

三、const_cast:  一般用于强制消除对象的常量性。它是唯一能做这一点的 C++ 风格的强制转型。 
 const int a=10;
 int *b= const_cast<int*>(&a);
 *b=9; 
 cout<<*b<<endl;  //可以更改常量了.9


下面是类的常量指针转为非常量指针   
 class C {};
 const C *a = new C;
 C *b = const_cast<C *>(a);

 

四、dynamic_cast: 主要用于执行“安全的向下转型(safe downcasting)”,将基类类型的指针或引用安全地转换为派生类型的指针或引用。
当用于多态类型时。dynamic_cast会检查操作是否有效,static_cast不可检测,检测在运行时进行。


1. 如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为0.如下:
              class Base { virtual void  dummy() {} };
 class Derived : public Base { };
 Base *basePtr=new Derived;
 Base *basePtr2=new Base;
 if (Derived *derivedPtr = dynamic_cast<Derived*>(basePtr))//第二种情况basePtr改为basePtr2;
 {   //BasePtr points at a Derived object
  cout<<"success"<<endl;
 } else { // BasePtr points at a Base object
  cout<<"BasePtr points at a Base object"<<endl;
 }
              //上面的程序用static_cast也可,只是没有检测,第二个指针是无效的...,
              //用reinterprep_cast也可,也没检测,不建议...最易出错
分析上面的程序,basePtr一开始创建了一个Derived类的空间, if强制转换过程中空间一致,输出success.
                        而basePtr2一开始创建一个Base空间,而后来强制转换时空间不一致,输出 第2个语句


2. 如果一个引用类型执行了类型转换并且这个转换是不可能的,一个bad_cast的异常类型被抛出,如下:
 Derived d1;
 Base temp;
 Base &b1=d1;
 Base &b2=temp;
  try 
  {
   Derived d2 = dynamic_cast<Derived &>(b1); //第二种情况的话,b1改为b2
  cout<<"success"<<endl;
  } 
  catch (bad_cast) 
 {
  cout<<"exception..."<<endl;
 }
             引用作用跟指针的作用差不多...



相应的Boost 的三种类型转化

dynamic_pointer_cast<T>()   const_pointer_cast<T>()   static_pointer_cast<T>()  但是返回的是转型后的share_ptr<T>()的类型,转型类似以上的对应的三种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值