一、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>()的类型,转型类似以上的对应的三种方式。