C++数据类型转换

来源:互联网 发布:图片mv制作软件下载 编辑:程序博客网 时间:2024/06/08 04:26

 C++ 同时提供了四种新的强制转型形式(通常称为新风格的或 C++ 风格的强制转型):

        const_cast<T>(expression);
        dynamic_cast<T>(expression);
        reinterpret_cast<T>(expression);
        static_cast<T>(expression);

 

        const_cast 一般用于强制消除对象的常量性。将它转换为一个对应指针类型的普通变量。反过来,也可以将一个非常量的指针变量转换为一个常指针变量。它是唯一能做到这一点的 C++ 风格的强制转型。

这种转换是在编译期间做出的类型更改。但是出于安全目的,const_cast无法将非指针的常量转换为普通变量。

     如:const int* pci = 0;int* pk = const_cast<int*>(pci);

 

    static_cast强制类型转换操作符主要用于基本类型之间和具有继承关系的类型之间的转换。

这种转换一般会更改变量的内部表示方式,因此,static_cast应用于指针类型转换没有太大意义。也可以用于将void* 指针转型为有类型指针,基类指针转型为派生类指针,但是它不能将一个const对象转型为non-const对象.(只有const_cast能做到.)

    例:
     //基本类型转换

    int i=0;double d = static_cast<double>(i);
     //转换继承类的对象为基类对象
     class Base{};class Derived : public Base{};
     Derived d;Base b = static_cast<Base>(d);

 

·   reinterpret_cast是特意用于底层的强制转型,导致实现依赖(implementation-dependent)(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制转型在底层代码以外应该极为罕见。reinterpret_cast 可以将指针值转换为一个整型数,但不能用于非指针类型的转换.

 

     dynamic_cast只用于对象的指针和引用。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。被转换的类型必须是一个指向含有虚函数的类类型的指针.它与static_cast相对,是动态转换。

这种转换是在运行时进行转换分析的,并非在编译时进行,明显区别于上面三个类型转换操作。dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL.例如:

    class Base { virtual dummy() {} };

    class Derived : public Base {};

 

    Base* b1 = new Derived;
    Base* b2 = new Base;

 

    Derived* d1 = dynamic_cast<Derived*>(b1);          // succeeds
    Derived* d2 = dynamic_cast<Derived*>(b2);          // fails:returns 'NULL'

 

    如果一个引用类型执行了类型转换并且这个转换是不可能的,一个bad_cast的异常类型就被抛出:

     class Base { virtualdummy() {} };
     class Derived : public Base {};

     Base* b1 = newDerived;
     Base* b2 = new Base;};

 

    Derived d1 =dynamic_cast<Derived&*>(b1);          //succeeds
    Derived d2 = dynamic_cast<Derived&*>(b2);          // fails:exception thrown

    dynamic_cast'比static_cast更严格更安全。dynamic_cast在执行效率上比static_cast要差一些,但static_cast在更宽上范围内可以完成映射,这种不加限制的映射伴随着不安全性.static_cast覆盖的变换类型除类层次的静态导航以外,还包括无映射变换,窄化变换(这种变换会导致对象切片,丢失信息),用VOID*的强制变换,隐式类型变换等..

原创粉丝点击