static_cast ,reinterpret_cast

用法:static_cast < type-id > ( expression )

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。

它主要有如下几种用法:

(1)用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。

  • 进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;
  • 进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

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

(3)把空指针转换成目标类型的空指针。

(4)把任何类型的表达式转换成void类型。

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

C++中static_cast和reinterpret_cast的区别

C++ primer第五章里写了编译器隐式执行任何类型转换都可由static_cast显示完成;reinterpret_cast通常为操作数的位模式提供较低层的重新解释

(1)显式类型转换

C++中的static_cast执行非多态的转换,用于代替C中通常的转换操作。因此,被做为显式类型转换使用。比如:

int i;
float f = 166.71;
i = static_cast<int>(f);

此时结果,i的值为166。

(2)位模式

C++中的reinterpret_cast主要是将数据从一种类型的转换为另一种类型。所谓“通常为操作数的位模式提供较低层的重新解释”也就是说将数据以二进制存在形式的重新解释。比如:

int i;
char *p = "This is an example.";
i = reinterpret_cast<int>(p);

此时结果,i与p的值是完全相同的。reinterpret_cast的作用是说将指针p的值以二进制(位模式)的方式被解释为整型,并赋给i,//i 也是指针,整型指针;一个明显的现象是在转换前后没有数位损失


C++同时提供了4种新的强制类型转换形式(通常称为新风格的或C++风格的强制转 型):const_cast(expression)、dynamic_cast(expression)、 reinterpret_cast(expression)和 static_cast(expression),每一种都适用于特定的目的,具体如下:

(1)dynamic_cast 主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。支持父类指针到子类指针的转换,这种转换时最安全的转换。它 是唯一不能用旧风格语法执行的强制类型转换,也是唯一可能有重大运行时代价的强制转换。

(2)static_cast 可以被用于强制隐形转换(例如,non-const对象转换为const对象,int转型为double,等等),它还可以用于很多这样的转换的反向转换 (例如,void*指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个const对象转型为non-const对象(只有 const_cast能做到),它最接近于C-style的转换。应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。

在这最后例子里,被转换的父类没有被检查是否与目的类型相一致。
代码:

class Base {};
class Derived : public Base {};Base *a = new Base;
Derived *b = static_cast<Derived *>(a);

static_cast除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换:
代码:

double d = 3.14159265;
int i = static_cast<int>(d);

(3)const_cast一般用于强制消除对象的常量性。它是唯一能做到这一点的C++风格的强制转型。这个转换能剥离一个对象的const属性,也就是说允许你对常量进行修改。

代码:

class C {};
const C *a = new C;
C *b = const_cast<C *>(a);

(4)reinterpret_cast 是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制类型在底层代码以外应该极为罕见。操作 结果只是简单的从一个指针到别的指针的值得二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。

旧风格 的强制转型依然合法,但是新的形式更可取。首先,在代码中它们更容易识别(无论是人还是像grep这样的工具都是如此),这样就简化了在代码中寻找类型系 统被破坏的地方的过程。其次,更精确地指定每一个强制转型的目的,使得编译器诊断使用错误成为可能。例如,试图使用一个const_cast以外的新风格 强制转型来消除常量性,代码将无法编译。

C++总结:static_cast ,reinterpret_cast相关推荐

  1. [C/C++]_[0基础]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和差别]

    场景: 1. C++的对象差别于C的原因是他们能够有继承关系, 方法有重载, 覆盖关系等, 他们的对象内存数据结构因此也比較复杂. 2. 非常多情况下我们须要一个父类来存储子类的指针对象进行通用方法的 ...

  2. [C/C++]_[初级]_[static_cast,reinterpret_cast,dynimic_cast的使用场景和区别]

    场景: 1. C++的对象区别于C的原因是他们可以有继承关系, 方法有重载, 覆盖关系等, 他们的对象内存数据结构因此也比较复杂. 2. 很多情况下我们需要一个父类来存储子类的指针对象进行通用方法的操 ...

  3. When should static_cast, dynamic_cast and reinterpret_cast be used?

    这是我偶然在 http://stackoverflow.com/questions/ 网页上发现的一个问题(类似博客园的博问),问题主要是关于询问应该怎样使用,以及何时使用C++里面的这几种类型转换操 ...

  4. 《C++ Primer 第五版》(第4.11-4.12节)——static_cast,const_cast和reinterpret_cast类型转换, 运算符优先级表

    1.static_cast,const_cast和reinterpret_cast类型转换 static_cast:强制的类型转换(不能用于底层的const转换),以前C语言中的强制类型转换都可以使用 ...

  5. 【C++】类型转换(const_cast、dynamic_cast、static_cast、reinterpret_cast)

    C++类型转换 C语言风格的类型转换符 const_cast dynamic_cast static_cast reinterpret_cast 总结 C语言风格的类型转换符 C 语言风格的类型转换符 ...

  6. C++ 强制类型转换操作符(static_cast、dynamic_cast、const_cast和reinterpret_cast)

    C++中的四种操作符形式类型转换 1.static_cast (静态类型转换) 主要使用场景:适用于将void*转换为其他的指针 int a = 100; void* pv = &a; //i ...

  7. static_cast 和 reinterpret_cast

    <<static_cast 和 reinterpret_cast>> 作者: 阙荣文(querw@sina.com) C/C++是强类型语言,不同类型之间的相互转换是比较麻烦的 ...

  8. static_cast 和 reinterpret_cast区别

    static_cast 和 reinterpret_cast <<static_cast 和 reinterpret_cast>> 作者: 阙荣文(querw@sina.com ...

  9. C++ 类型转换 :C语言的类型转换、C++的四种强制类型转换、explicit

    文章目录 C语言中的类型转换 隐式类型转换 显式类型转换 C++ 强制类型转换 static_cast reinterpret_cast const_cast dynamic_cast explici ...

  10. C++基础知识(四)—— 操作符/运算符

    前面已经学习了变量和常量,我们可以开始对它们进行操作,这就要用到C++的操作符.有些语言,很多操作符都是一些关键字, 比如add, equals等等.C++的操作符主要是由符号组成的.这些符号不在字母 ...

最新文章

  1. 键盘历史记录实用程序已停止工作 解决办法
  2. jquery each函数的使用
  3. python遍历目录压缩文件夹_Python实现多级目录压缩与解压文件的方法
  4. jdk11换jdk8版本_在JDK 9(以及8)以及更高版本中,所有内容都可以作为一个流
  5. SpringBoot2.X 整合Redis实现简单缓存操作
  6. devops 文化_需要建立DevOps文化
  7. oracle的sid
  8. html5 content type,Content-Type一览
  9. 开源风云 20 年!
  10. ios超级签名_ios超级签名多少钱?决定超级签名价格的因素有哪些
  11. Android mainfests手记
  12. PowerPoint的巧妙使用就可造就一场经济而又专业的知识竞赛场面
  13. 知识笔记 - 平头哥ratel安卓Hook框架的安装与简单使用
  14. 模拟电路设计(23)---模数和数模转换器概述
  15. 《通关!游戏设计之道(continue...)》
  16. geoJson全国各省市地图json数据获取
  17. Dream_Chaser队训练赛第一场 K题
  18. 系统分析实验 Python
  19. abel数值反演的matlab实现,abel变换数值反演的积分算子方法.pdf
  20. 进击的巨人 《兵王》6月28日启动新服【游戏资讯】

热门文章

  1. AR导航真的有前途,马云领衔1亿2500万投资
  2. 不敢去争取,学不会珍惜,却难以忘记——dbGet(三)
  3. [实战]MVC5+EF6+MySql企业网盘实战(24)——视频列表
  4. linux内核镜像的分层,Docker镜像分层的原理详解
  5. hal库开启中断关中断_STM32 HAL库学习系列第9篇---NVIC按键外部中断函数
  6. 修改Eclipse的WorkSpace保持数[转载]
  7. 基础XML配置的AOP与基于注解实现的AOP详细对比
  8. H3C中标苏州教育城域网改造项目
  9. ActionMapping
  10. 可多语句执行下不用单引号outfile写shell