reinterpret_cast用在任意指针(或引用)类型之间的转化,以及指针与足够大的整数类型之间的转化,从整数类型(包括枚举类型)到指针类型,无视大小。
作用及原理:将一个类型的指针,转换为另一个类型的指针,这种转换不用修改指针变量值数据存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可以,当然他也可以将指针转换成整型值,但不能做非指针类型转换
#include<iostream> #include<typeinfo> using namespace std; int main() { //Basic type pointer conversion double d = 9.3; double *pd = &d; int *pi = reinterpret_cast<int*> (pd); //irrelated class poniter type conversion class A{}; class B{}; A* pa = new A; B* pb = reinterpret_cast<B*>(pa); //poniter convertedto integer long j = reinterpret_cast<long>(pi); return 0; }
const_cast
作用及原理:用于去除指针变量的常量属性,将它转换为一个对应的指针类型的普通变量,当然,也可以将一个非常量的指针变量转换为一个常指针变量。这种转换在编译期间。
#include<iostream> #include<typeinfo> using namespace std; int main() { const int* pci = 0; //常量区的值都是0? int *pj = const_cast<int*>(pci); cout << pj << endl; return 0; }
static_cast
作用原理:主要用于基本类型之间和具有继承关系的类型之间的转换。
#include<iostream> #include<typeinfo> using namespace std; int main() { //基本类型转换 int i=0; 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 0; }
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 << "Converted error" << endl; } else { cout << "Converted success" << endl; } //没有继承关系,但被转换的类有虚函数 class A{virtual ~A(){}}; //有虚函数 class B{}; A* pa = new A; B* pb = dynamic_cast<B*>(pa); if (!pb) { cout << "Converted error. Incldue virtual" << endl; } else { cout << "Converted success. Incldue virtual" << endl; } return 0; }
运行结果:
ubuntu@ubuntu:~/wangqinghe/C++/20200120$ g++ dynamic_cast.cpp -o dynamic_cast
ubuntu@ubuntu:~/wangqinghe/C++/20200120$ ./dynamic_cast
Converted success
Converted error. Incldue virtual
没有继承关系的类之间转换,如果转换的类中有虚函数,编译器会通过,但是转化失败。
总结:
reinterpret_cast 适用于指针转换为另一种指针。允许将任何指针类型转换为其他类型。
const_cast 适用于常指针变量,可以使指针变量变为非常指针变量。
static_cast 主要用于基本类型转换和拥有继承关系变量之间的转换。
dynamic_cast 只能在继承对象的指针之间或引用之间进行类型转换。
主要:头文件包含在#include<typeinfo>中。