zoukankan      html  css  js  c++  java
  • C++的类型转换函数

    C++的类型转换函数

    reinterpret_castconst_caststatic_castdynamic_cast 前三个类型转换是在编译时实现转换,dynamic_cast是在运行时进行类型转换的。

    reinterpret_cast<new type>expression

    const_cast<  new type>( expression)

    static_cast<new type>(expression)

    dynamic_cast<newtype>(expression)

     

    1reinterpret_cast

    reinterpret_cast将一个类型的指针转换为另一个类型的指针,它也允许从一个指针转换为整数类型。这种转换不用修改指针变量值数据存放格式(不改变指针变量),而是在编译时重新解释指针的类型(操作结果只是简单的从一个指针到别的指针的值的二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换)不能用于非指针类型的转换

    1)转换一个指针为其它类型的指针,能够在非相关的类型之间转换

    class A {};

    class B {};

    A * a = new A;

    B * b = reinterpret_cast<B *>(a);

    2)不能将const指针转换为非const        

             const int* point =&j;

            dm  =reinterpret_cast<double*>(point);

     3)不能用于非指针类型的转换

             int i; double j = 2.1

             j =reinterpret_cast<int>(j);

     4可以将一段buffer转成一个类的对象指针,或者反过来。

    class A;

    A a;

    char* pBuffer = reinterpret_cast<char*> (&a);

     

      

    2const_cast

    const_cast用于const指针与普通指针间的相互转换(将一个const指针转换为对应指针类型的普通指针变量,也可以将一个普通指针变量转换为一个const指针)。不能将非常量指针变量转换为普通变量const转为非const,或者volatile转为非volatile)。

     

     

    class C {};

    const C *a = new C;

    C *b = const_cast<C *>(a);

     

    3static_cast

    static_cast主要用于基本类型间的相互转换,和具有继承关系间的类型转换(将子类类型的指针转换为父类类型的指针,也能够转换父类类型的指针为它的子类类型的指针)。

       1)用于替代C风格的显式转换和各种类型指针到void*的转换

                        long b = (int) a;

               long b =static_cast<int>(a);

            2)用于父类到子类指针的转换

            3)不能在类层次外转换,所以static_cast比C方式转换安全。

            float x;

          Count<<static_cast<int>(x);//x作为整型值输出

     

    4dynamic_cast

    dynamic_cast只能在继承类对象的指针之间或引用的相互转换,在运行时动态转换。只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程会检查操作是否有效。指针间转换失败可以通过判断是否为null来判断,引用转换失败则抛出 bad_cast 异常。

      1只有类中含有虚函数才能用dynamic_cast,因其是依赖于VTable来工作的。

          2用于多态类型的转换,比如从父类到子类的转换。

          3当明确知道子类的类型时,可用static_cast转换,其效率高点。

       

             class Car;

             classCabriolet:public Car{};

             classLimousline:public Car{};

             voidf(Car *cp)

             {

                  Cabriolet*p = dynamic_cast< Cabriolet > cp;

             }

  • 相关阅读:
    Gym102040 .Asia Dhaka Regional Contest(寒假自训第9场)
    Gym-101673 :East Central North America Regional Contest (ECNA 2017)(寒假自训第8场)
    Gym -102007 :Benelux Algorithm Programming Contest (BAPC 18) (寒假自训第5场)
    Gym .101879 USP Try-outs (寒假自训第七场)
    Gym.101908 Brazil Subregional Programming Contest(寒假自训第六场)
    Gym .101933 Nordic Collegiate Programming Contest (NCPC 2018) (寒假gym自训第四场)
    Gym .102021 .German Collegiate Programming Contest (GCPC 18) (寒假gym自训第三场)
    Gym.102059: 2018-2019 XIX Open Cup, Grand Prix of Korea(寒假gym自训第一场)
    【整理】简单的数学期望和概率DP
    猿助力下载地址
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573898.html
Copyright © 2011-2022 走看看