C++中四种类型转换

来源:互联网 发布:淘宝古琴哪家好 编辑:程序博客网 时间:2024/06/14 05:31

C++中四种类型转换有:static_cast、const_cast、dynamic_cast和reinterpret_cast

一、static_cast

static_cast对任何具有明确定义的类型转换,只要不包含底层const,都可以使用static_cast。

 

旧式的强制类型转换

早期的C++版本中,显示的进行强制类型转换包含两种形式:

1) type(expr) ;//函数形式的强制类型装换

2) (type) expr;//C语言风格的强制类型转换

 

1.static_cast在编译时就进行类型转换,在C++中就是要替代旧式的强制类型转换,static_cast这种强制类型转换是安全的,如果编译器发现一个较大的算术类型(double)试图赋值给较小的类型(int),编译器不会发出警告信息。

例如: int a=10;

          int b=3;

          doubled=static_cast<double>(a);

          //执行整数类型的除法

           double slope=a/b;      //结果为3

          //执行浮点数的除法

        double slope2=static_cast<double>(a)/b;      //结果为3.33;

2.static_cast对编译器无法自动执行的类型转换也非常有用。例如,我们可以使用static_cast找回存在于void*指针中的值:

doubled=5.0;

 void *p=&d; //任何非常量对象的地址都能存入void*中

double*dp=static_cast<double*>(p);//将void*转换回初始的指针类型

 注:static_cast不能转换掉表达式的const

二、const_cast

const_cast只能改变运算对象的底层const,而不能改变运算对象的顶层const

注:const_cast<>中的类型必须是指针或者引用类型

例如:const inta=10;

          int a2=15;

         const int *pci=&a;

         const int *pci2=&a2;

        int * pi=const_cast<int *>(pci)//通过pi改变a的值是失败的

        int * pi2=const_cast<int*>(pci2)//通过pi2改变a2的值是成功的

说明:(1)pci指针指向一个常量对象时,通过使用const_cast类型转换去掉const,赋值为pi指针,不能通过pi指针改变原始常量对象的值。

(2)pci2指针指向一个非常量对象时,通过使用const_cast类型转换去掉const,赋值为pi2指针时,能够通过pi2指针改变原始非常量对象的值。

 

三、reinterpret_cast

reinterpret_cast通过为运算对象的位模式提供较低层次上的重新解释。通俗一点就是说,将内存中的数据以二进制存在的形式进行重新解释成其他类型。实质上并没有改变内存中的数据,而是以另外一种类型格式直接读取内存中的信息。

例如:

intn=20;

    int*pi=&n;

    double*pd3=reinterpret_cast<double*>(pi);

    cout<<*pd3<<endl;//*pd3输出的值是(-9.25596e+061)一个乱指,而不是20.0,只是把20这个值按照double类型重新解释,读取重新解释的新值

注:reinterpret_cast只能以用于指针或引用类型,且使用reinterpret_cast是非常危险的,所以应谨慎使用reinterpret_cast。

四、dynamic_cast

详见:http://blog.csdn.net/xingkongfenqi/article/details/49148885

0 0
原创粉丝点击