zoukankan      html  css  js  c++  java
  • C++中的4种显示类型转换(草稿)

    类型转换在。我们编写程序时是不可避免的,比如我们分配一个内存区域,它将要存储的对象类型对编译器是不可知的。最典型的例子就是void*指针,调用malloc时会返回一个void*,编译器并不知道void*指向的对象类型。

    由此可见,类型转换时不可以或缺的!下面我们介绍C++提供的4种显示类型转换,及继承自C的类型转换方式(Type)expression。本文的主要内容如下:

    • 写在前面
    • static_cast(exp)显示转换
    • reinterpret_cast(exp)显式转换
    • dynamic_cast(exp)显示转换
    • const_cast(exp)显示转换
    • 总结

    1、写在前面

    显示类型转换有时是必需的,如前面提到的void *指针。我们必须将malloc返回的void*指针显示转换为特定的类型,eg.:int * p=static_cast<int*>(malloc(100));还有如果我们想通过一个给定的十六进制数访问内存。这大大方便了我们编程,但同时也带来了风险,用得不好将成为很多错误的根源!如你通过一个十六进数去访问内存可能会导致程序崩溃;如你内存转换时可能会截断原有数据……

    因此我们在类型转换时必须得小心。

    2、static_cast(exp)显示转换

    static_cast类型转换用于相关类型之间的转换,诸如:在同一个类的继承层次关系中,向上或向下转换;枚举类型与整数类型之间的转换;浮点类型与指数类型之间的转换。

    。。。

    在这4中类型转换中,static_cast是最接近C-style的了。

    3、reinterpret_cast(exp)显式转换

    字面理解即re-interpret,重新解析(释)的意思。故名思意,它主要用于不相关类型之间的转换,好一个英文单词在不同的上下文中,词性和词义可能完全不同。它为不同类型之间转换带来的便利,但是也伴随着风险的,如将一个十六进制整数转换为内存地址(由int-->指针类型,这两种类型完全不关联)。既然是用于不相关类型之间的转换,也就意味着编译器不会做太多的确认和承诺。

    reinterpret_cast方式还有一个特点就是:目标和原始值之间至少有相同的位数,我们可以将转换之后的值再转换回去,而不像其它3种类型可能会导致精度丢失。

    。。。。。。。。。

    4、dynamic_cast(exp)显示转换

    一种运行时(run-time)检测的类型转换,因此转换可能需要较大的运行时代价,这种类型也是用C-style是无法实现的。主要用于执行类型向下转换和继承之间的转换。

    。。。。

    5、const_cast(exp)显示转换

    用于消除变量的const限定,转换之后的变量就不再具有“const”了,如果是一个const指针的话,转换之后可以改变指向而指向其它对象。

    。。。。。

    6、总结

    用C-style的(Type)expression的格式转换,可以用我们上面介绍的4种方式来替代。虽然C++中可以使用C-style的形式仍可用,但更加建议使用上面的4中类型。因为C-style的类型转换更加危险:

    • 在一个大型程序中更难定位和识别
    • 哪种类型转换并不明显

    而用上面的四种方式可以更加准确地定位哪种类型转换发生了错误。

  • 相关阅读:
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 连号区间数
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Java实现 蓝桥杯 历届试题 大臣的旅费
    Navicat查询哪些表有指定字段名
  • 原文地址:https://www.cnblogs.com/skynet/p/1839731.html
Copyright © 2011-2022 走看看