转载自http://kooyee.iteye.com/blog/364632,感谢原作者
reinterpret_cast,const_cast,static_cast,dynamic_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; }
class B{ public: int m_iNum; virtual void foo(); }; class D:public B{ public: char *m_szName[100]; }; void func(B *pb){ D *pd1 = static_cast<D *>(pb); D *pd2 = dynamic_cast<D *>((pb); }
class A{ public: int m_iNum; virtual void f(){} }; class B:public A{ }; class D:public A{ }; void foo(){ B *pb = new B; pb->m_iNum = 100; D *pd1 = static_cast<D *>((pb); //compile error D *pd2 = dynamic_cast<D *>((pb); //pd2 is NULL delete pb; }
class B{ public: int m_iNum; } void foo(){ const B b1; b1.m_iNum = 100; //comile error B b2 = const_cast<B>((b1); b2. m_iNum = 200; //fine }