• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解

static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了static cast,static cast int,c static cast,static cast double,static cast float等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

C-style cast举例:
 int i;
 double d;
 i = (int) d;

上面的代码就是本来为double类型的d,通过(int)d将其转换成整形值,并将该值赋给整形变量i (注意d本身的值并没有发生改变)。这就是典型的c-style类型转换。

下面是一个简单的程序:

b) 用于基本数据类型之间的转换,如把int转换成char,这种转换的安全性也要由开发人员来保证。

c) 可以把空指针转换成目标类型的空指针(null pointer)。

d) 把任何类型的表达式转换成void类型。
注意: static_cast不能转换掉expression的const、volitale或者__unaligned属性。

2)dynamic_cast
用法:
dynamic_cast <typeid> (expression)
说明:该运算符把expression转换成typeid类型的对象。typeid必须是类的指针、类的引用或者void*。如果typeid是类的指针类型,那么expression也必须是指针,如果typeid是一个引用,那么expression也必须是一个引用。一般情况下,dynamic_cast用于具有多态性的类(即有虚函数的类)的类型转换。

dynamic_cast依赖于RTTI信息,其次,在转换时,dynamic_cast会检查转换的source对象是否真的可以转换成target类型,这种检查不是语法上的,而是真实情况的检查。先看RTTI相关部分,通常,许多编译器都是通过vtable找到对象的RTTI信息的,这也就意味着,如果基类没有虚方法,也就无法判断一个基类指针变量所指对象的真实类型,这时候,dynamic_cast只能用来做安全的转换,例如从派生类指针转换成基类指针。而这种转换其实并不需要dynamic_cast参与。也就是说,dynamic_cast是根据RTTI记载的信息来判断类型转换是否合法的。

用途:主要用于类层次之间的up-casting和down-casting,还可以用于类之间的交叉转换。在进行down-casting时,dynamic_cast具有类型检查的功能,比static_cast更安全。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象指针,返回值为NULL。当用于多态类型时,它允许任意的隐式类型转换以及相反过程。不过,与static_cast不同,在后一种情况里(注:即隐式转 换的相反过程),dynamic_cast会检查操作是否有效。也就是说,它会检查转换是否会返回一个被请求的有效的完整对象。

注意:dynamic_cast不能转换掉expression的const、volitale或者__unaligned属性。

3) reinterpret_cast
用法:reinterpret_cast <typeid>(expression)
说明:转换一个指针为其他类型的指针,也允许将一个指针转换为整数类型,反之亦然。这个操作符能够在非相关的类型之间进行转换。操作结果只是简单的从一个指针到别的指针的值的二进制拷贝,在类型之间指向的内容不做任何类型的检查和转换。这是一个强制转换。使用时有很大的风险,慎用之。
注意:reinterpret _cast不能转换掉expression的const、volitale或者__unaligned属性。

4)const_cast
用法:const_cast<typeid>(expression)
说明:这个类型操纵传递对象的const属性,或者是设置或者是移除。如:
Class C{…}
const C* a = new C;
C* b = const_cast<C*>(a);

如果将上面的const_cast转换成其他任何其他的转换,编译都不能通过,出错的信心大致如下:
“…cannot convert from 'const class C *' to 'class C *'”。

下面的代码是4中casting方法的典型用法示例:
      &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 由static_cast和dynamic_cast到C++对象占用内存的全面分析
  • 解析C++编程中的bad_cast异常
  • C++中4种类型转换方式 cast操作详解
  • 关于C++中的static关键字的总结
  • static_cast,dynamic_cast,reinterpret_cast和const_cast的区别详解
  • C++中四种对象生存期和作用域以及static的用法总结分析
  • 解析static在C和C++中的用法以及区别
  • 从汇编看c++中函数里面的static关键字的使用说明

相关文章

  • 2017-05-28深入解析C++程序中激发事件和COM中的事件处理
  • 2017-05-28深入理解c++中char*与wchar_t*与string以及wstring之间的相互转换
  • 2017-05-28C程序读取键盘码的方法
  • 2017-05-28枚举类型的定义和应用总结
  • 2017-05-28详解图的应用(最小生成树、拓扑排序、关键路径、最短路径)
  • 2017-05-28char str[] 与 char *str的区别详细解析
  • 2017-05-28C 语言中实现环形缓冲区
  • 2017-05-28GCC 编译c程序的方法及过程解析
  • 2017-05-28用标准c++实现string与各种类型之间的转换
  • 2017-05-28Windows窗口消息实例详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C实现的非阻塞方式命令行端口扫描器源码
    • tcp socket客户端和服务端示例分享
    • 用C语言判断一个二叉树是否为另一个的子结构
    • C++函数pyrUp和pyrDown来实现图像金字塔功能
    • 深入解析C++中派生类的构造函数
    • C语言指针的长度和类型深入分析
    • C++调用Python基础功能实例详解
    • C语言中操作密码文件的一些函数总结
    • C++实现的归并排序算法详解
    • Linux线程同步之信号C语言实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有