C语言中我们使用 int a=(int) b;的方式强制转换

C++提供了四种类型转换方式

const_cast

把常量属性去掉的一个转换.const  int a =10;int *p1=(int *)(&a);//C 语言 OKint *p2=const_cast(&a);//OKdouble *p3 =(double *) (&a)//c 语言中可以,p3的寻址范围变大,带来风险double  *p4=const_cast(&a);//c++在编译阶段就提示错误只用于去掉常量属性的地方int b=const_cast(a);//NO ,ERROR const_carst

static_cast

能够提供编译器认为安全的类型转换90%使用场景是这个,这个用的是比较多的,几乎能做任何类型转换,但是是要译器认为安全的类型转换int a=10;char b=static_cast(a);//OKint *p=nullptr;short *b=static_cast(p) ;  //c++ NO , 两者之间没有任何联系double *b=static_cast(p) ;//C++ NO , 两者之间没有任何联系double *b1=(double *)(p) ;//C语言 OK 基类和派生类之间可以使用 static_cast 

reinterpret_cast

int *p=nullptr;short *b=reinterpret_cast(p) ;  //c++ OK ,double *b=reinterpret_cast(p) ;//C++ OK , double *b1=(double *)(p) ;//C语言 OK 类似于C语言的强制类型转换

dynamic_cast
主要用着继承结构中,可以支持RTTI类型识别的上下转换

代码

#include using namespace std;class  A{public:        void virtual function(){cout<<"A function()"<<endl;    }};class B : public A{public:    void virtual function(){cout<<"B function()"<<endl;   }   void virtual test(){cout<<"B function()"<<endl;   }};class C : public A{public:    void virtual function(){cout<<"C function()"<<endl;    }};class D : public A{public:    void virtual function(){cout<<"D function()"<vfptr->vftable ->RTTI信息,如果dynamic_cast转换成功       //返回 指向B的地址,否则返回nullptr       B  *pb =dynamic_cast pa;       if(pb!=nullptr){    pb->test();       }       else{    pa->function();       }}int main(){   B b;   C c;   D d;   show(&b);   show(&c);   show(&d);   return 0;         }