您的位置:首页 > 编程语言 > C语言/C++

c++的类型转换

2014-02-11 13:12 288 查看
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 属性,  它的作用不是为了修改变量,而是为了能让函数接受这个变量作为参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: