• 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;

             }

  • 相关阅读:
    oracle之rman备份
    oracle数据库经常提示27102 out of memory解决方法
    异构环境oracle数据库迁移dmp文件之exp和imp以及expdp和impdp
    新安装的win7/win10系统,所有驱动都没安装,插入U盘也无法识别解决方法
    oracle使用一条语句批量插入多条数据
    oracle使用flashback时,没有显示undosql
    export的变量另开一个终端失效解决方法
    oracle服务器重启后无法进入系统,登录系统时提示model is unknow
    mysql将某数据库的全部权限赋给某用户,提示1044错误Access denied
    如何取消noarch.rpm包
  • 原文地址:https://www.cnblogs.com/dyufei/p/2573898.html
Copyright © 2020-2023  润新知