1.reinterpret_cast
作用及原理:将一个类型的指针,转换为另一个类型的指针,这种转换不用修改指针变量值数据存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以,当然他也可以将指针转换成整型值,但不能做非指针类型转换
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
//基本类型指针变换
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);//相当于隐式转换B* pb=(B*)pa; //指针转换成整数
long j=reinterpret_cast<long>(pi);//相当于隐式转换long j=(long)pi; return ;
}
2.const_cast
作用及原理:用于去除指针变量的常量属性,将它转换为一个对应的指针类型的普通变量,当然,也可以将一个非常量的指针变量转换为一个常指针变量。这种转换在编译期间
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
const int* pci=;
int* pj=const_cast<int*>(pci);//相当于隐式转换int* pj=(int*)pci; return ;
}
3.static_cast
作用及原理:主要用于基本类型之间和具有继承关系的类型之间的转换
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
//基本类型转换
int i=;
double d=static_cast<double>(i);//相当于隐式转换double d=(double) i;
int j=static_cast<int>(d);//相当于隐式转换int j=(int)d; //转换继承类的对象
class Base{};
class Derived:public Base{};
Derived D;
Base b=static_cast<Base>(D);//将子类对象赋值给父类对象 return ;
}
4.dynamic_cast
作用及其原理:dynamic_cast转换是动态转换,这种转换是在运行时进行转换分析,而不是在编译时期进行,这是区别以上三种转化的一处。dynamic_cast只能在继承类对象的指针之间或引用之间进行转换,进行转换时,会根据当前运行对象的运行类型信息(RTTI),判断类型对象之间的转换是否合法。dynamic_cast的指针转换失败,可通过是否为null指针来检测
#include<iostream>
#include<typeinfo> using namespace std; int main()
{
class Base{};
class Derived:public Base{};
//子类指针转换为父类指针
Derived* pd=new Derived;
Base* pc=dynamic_cast<Base*>(pd); if(!pc)
cout<<"转换失败"<<endl;
else
cout<<"转换成功"<<endl; //没有继承关系,但被转换的类有虚函数
class A{virtual ~A(){}};//有虚函数
class B{}; A* pa=new A;
B* pb=dynamic_cast<B*>(pa); if(!pb)
cout<<"转换失败"<<endl;
else
cout<<"转换成功"<<endl; return ;
}
结果如下:
没有继承关系的类之间转换,如果被转换的类有虚函数,编译器会通过,但是转换会失败
总结:
reinterpret_cast适用于指针转换为另一种指针
const_cast适用于常指针变量,可以使常指针变量变为非常指针变量
static_cast主要用于基本类型转换和拥有继承关系变量之间的转换
dynamic_cast只能在继承对象的指针之间或引用之间进行类型转换
注意:需要添加头文件#include<typeinfo>