1、C中的转换:隐式转换和显示强制转换
1) 隐式转换 :所谓隐式类型转换就是语言本身,使用 编译器,自动就给我们专程了我们需要的类型
int num=5;
float ab=num;//隐式转换
2)显示转换
float num =0.67;
int a=(int ) num;//显示转换
在C中,我们通常用(type)来进行强制类型转换,这种转换是暴力的;不管被转换的数据是否能转换成type类型,编译器都会去强制转换;但是它毕竟是C中的转换,所以对于C++中的某些情况是不适用的:子类与父类的类型转换、
2、C++中的类型转换符:static_cast、 dynamic_cast const_cast reinterpret_cast
他们的语法规则为:static_cast<typeid> (expression) dynamic_cast <typeid> (expression) const_cast<typeid> (expression) reinterpret_cast<typeid> (expression)
1) static_cast
这个操作符类似于C中的强制转换,在很多场合都会用到它,或者是当你不知道什么时候该用剩下的dynamic_cast const_cast reinterpret_cast等转换符时,都可以用static_cast来进行转换。
适用场合:用在int转换float,子类型转换成父类型(上型转换,这是安全的,都是可以这换转换的,用父类型的指针去指向子类型的指针),父类型转换成子类型(下行转换,是不安全的,需要程序员自己去保证安全性 ),其他类型的指针转换成void* ,void *转换成其他类型的指针;
不适用场合:static_cast 不能去掉 express中的const 属性volitale属性;(因为这些属性的去掉可以利用更专业的类型转换符 const_cast来完成)
2)dynamic_cast
顾名思义,这个类型转换操作符是用在多态上的;
适用场合:子类与父类型的上下行类型转换上;类型之间的交叉转换中(兄弟类型)
使用说明:I)子类转换成父类的上行转换中,同static_cast 是安全的(是用父类型的指针或者引用去指向子类型的指针或者引用)
II)父类型转换成子类型的下行转换中,需要要求有虚函数的存在,(因为有了虚函数,才能有虚函数表,才能在运行时获得两者的继承关系,去动态转换) dynamic_cast具有类型检查的功能,比static_cast更安全。
III) 交叉转换时,返回NULL,而对于static_cast则编译error.
eg:
class A { public : virtual A~(){}; int m_a; } class B:public A { public: int m_b; } class C: public A {}
class D {}
A *p_A=new A(); B *p_B=new B(); D *p_D=new D(); p_A=static_cast<A*>(p_B);//ok,父类指针指向子类对象,不管是static_cast 还是dynamic_cast 都是可以的; p_B=static_cast<B*>(p_A);//ok,但是不安全,在运行时,可以出现错误; p_A=dynamic_cast<A*>(p_B);//ok,父类指针指向子类对象,不管是static_cast 还是dynamic_cast 都是可以的; p_B=dynamic_cast<B*>(p_A);//在A中有虚函数时,ok! 返回NULL指针 // 在A中没有虚函数时,error!编译时错误!p_B=static_cast<B*>(p_D);//compile errorp_B=dynamic_cast<B*>(p_D);//编译时ok,运行时p_B被赋值为NULL;
3)const_cast
适用场合:把带有const、volitale属性的expression 转换成不带这些属性的typeid类型。
4)reinterpret_cast
适用场合:这种转换一般是低层次的转换,带有这种转换的代码移植性不是很好。