c++的类型转换

1.c++的四种类型转换

    static_cast, dynamic_cast, reinterpret_cast, const_cast

 

    语法格式:

    static_cast<type>(expr);

    static_cast<void*>(expr);  

 

2.类型转换的运用

    (1).类的上下行转换和交叉转换

        上行转换: 派生类指针转换到基类指针。

        下行转换: 基类指针转换到派生类指针。

       

        reinterpret_cast 可以用于上行转换也可以用于交叉转换,并且没有任何限制条件,但是安全性由程序员保证。

        static_cast 可以用于上下行转换,但是在下行转换的时候不进行类型检查,所以转换是不安全的,转换安全行要由程序员保证。

        dynamic_cast可以用于上下行转换,在下行转换的时候在编译期间就会进行类型检查,如果类型检查失败编译就不能通过。dynamic_cast的类型检查是利用虚函数表里面的类型信息,所以如果基类没有虚函数的话,那就没有虚函数表,那编译就不能通过。       

ex:
    class B{  };   

    class D:public B{};
     
    int  main() 
    { 
        B *pB = new B;
   
        D *p = dynamic_cast<D*>(pB);//error C2683: 'dynamic_cast' : 'B' is not a polymorphic type

        D *pS = static_cast<D*>(pB);//这里不会报错,只是不能保证类型安全。
    }
   
    改正的方法只需要在基类和子类有虚函数表就可以了:
    class B{ public:  virturl ~B(){} };

 

    交叉转换:所谓交叉转换就是一个基类有不同的子类,转换在这个基类的不同子类的对象指针之间进行。

    static_cast 不能用于交叉转换,编译器会报错。

    dynamic_cast 能用于交叉转换, 所依赖的仍然是虚函数表里面的信息。

    ex:  

    class B{public: virtual ~B(){}  };   

   class D1:public B{};
  
   class D2:public B{};

   int  main()  
   {  
       B *pB = new B;

       D1 *pD1 = dynamic_cast<D1*>(new D2);
   } 

 

   dynamic_cast转换的结果为NULL的时候:

   dynamic_cast 转换依赖的是虚函数表里面的信息,但是在转换的时候,如果类型不能匹配的话,那么dynamic_cast 转换将得到一个NULL值。

   ex:

   B *pB = new B;
   //pD1的结果会是一个NULL值,因为类型不匹配
   D1 *pD1 = dynamic_cast<D1*>(pB);
   if(pD1 == NULL ){...}
   //pD2的值也会是一个NULL值,因为类型不匹配
   D2 *pD2 = dynamic_cast<D2*>(new D1);
   //pB1 不会是一个NULL值,因为类型匹配,并且是一个上行转换
   B *pB1 = dynamic_cast<B*>(new D1);

 

    (2)基本类型之间的转换:

        基本类型,比如int, char, short 等之间的转换是默认完成的,或者通过static_cast 也可以。

        ex:

        int a;

        char c = a;

        char c1 = static_cast<char>(a);

 

    (3)基本类型指针之间的转换

        基本类型指针之间的转换只能使用 reinterpret_cast.

        ex:

        char *pChar;

        byte *pByte = reinterpret_cast<byte*>(pChar);

  

    (4).void* 和 基本类型指针、对象指针之间的转换

        reinterpret_cast肯定是可以的。

        static_cast也是可以的,static_cast就是为这个设计的。

            ex:

             byte *pByte = new byte;
             void *pVoid = static_cast<void*>(pByte);
             char *pChar = static_cast<char*>(pVoid);

 

        dynamic_cast 只能用于 类对象指针到 void*的转换, 并且要求这个类具有虚函数表。

             ex:
              B *pB;
              void *pVoid = dynamic_cast<void*>(pB);
              pB = dynamic_cast<B*>(pVoid);//这里会报错,dynamic_cast不允许做这样的转换。这里可以换成  static_cast

 

     (5). 数和指针之间的转换

           数和指针之间的转换只能使用 reinterpret_cast.

           ex:

            int a=0x1234;
            char* pChar = reinterpret_cast<char*>(a);
            a = reinterpret_cast<int>(pChar);

 

3.const_cast

      const_cast 是用来去除指针或者引用的 const 属性,  它的作用不是为了修改变量,而是为了能让函数接受这个变量作为参数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值