现在的位置: 首页 > 综合 > 正文

c++中的类型转换符

2013年10月12日 ⁄ 综合 ⁄ 共 1849字 ⁄ 字号 评论关闭

   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 error

p_B=dynamic_cast<B*>(p_D);//编译时ok,运行时p_B被赋值为NULL;


3)const_cast

   适用场合:把带有const、volitale属性的expression 转换成不带这些属性的typeid类型。

4)reinterpret_cast

    适用场合:这种转换一般是低层次的转换,带有这种转换的代码移植性不是很好。

       

      

抱歉!评论已关闭.