显式类型转换

来源:互联网 发布:北欧移民知乎 编辑:程序博客网 时间:2024/05/22 04:41

    将一种类型转换为另一种类型,转换后的变量,它的内部数据存储方式也随之发生改变,有四个显示的类型转换函数,reinterpret_cast,const_cast,static_cast,dynamic_cast.前面三个是在编译期间实现转换的,最后一个是在运行时实现转换,还可返回转换成功与否标志。

    double d=3.2;

    int i=d;//隐式转换,i=3

    double d=3.2;

    int i=static_cast<int>(d);//显式转换,i=3


转换函数的原型

    reinterpret_cast<new_type>(expression)

    const_cast<new_type>(expression)

    static_cast<new_type>(expression)

    dynamic_cast<new_type>(expression)

    将expression表达式的值转换为new_type类型的值。


reinterpret_cast

    用于任意指针(或引用)类型之间的转换,指针与足够大的整数类型之间的转化(从整数类型到指针类型,无视大小)。不修改指针变量值数据存放格式,只在编译时重新解释指针的类型。不能用于非指针类型的转换。还可将一个指针值转换为整型数。即expression必须是个指针类型。不能将const指针转换为void*指针。


const_cast

    去除指针变量的常量属性,将它转换为一个对应指针类型的普通变量。也可将一个非常量的指针变量转换为一个常指针变量。不能将非指针的常量变为普通变量。


static_cast

    用于基本类型和具有继承关系的类型之间的转换。会改变变量的内部表示方式。继承类和基类的指针可以相互转换,继承类可转换为基类,不可转化基本类型的指针,基类不可转换为继承类。


dynamic_cast

    只能在继承类对象的指针之间或引用之间进行转换。

    vc++编译器默认禁止使用RTTI信息,若要使用dynamic_cast,需执行“工程-设置”在“c++”选项卡中,选择“c++language”,勾选“允许运行时类型信息RTTI”

 

在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。