转自:https://www.cnblogs.com/heyonggang/p/3361643.html

原文地址:https://www.cnblogs.com/heyonggang/p/3361643.html

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

该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。它主要有如下几种用法:

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

进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;

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

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

③把空指针转换成目标类型的空指针。

④把任何类型的表达式转换成void类型。

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

C++中static_cast和reinterpret_cast的区别

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

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

1

2

3

int i;

float f = 166.71;

i = static_cast<int>(f);

此时结果,i的值为166。

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

1

2

3

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. oracle中drop和delete,oracle中delete drop truncate的用法和区别

    数据库的运维中,经常会遇到delete drop truncate的操作,那么如何去把握它们的用法和区别呢? 比如当数据库空间爆满,已经增长到存储空间单个存储文件的最大值32G.你需要通过一些办法释放 ...

  2. Numpy 中 linspace 和 arrange 的用法和区别

    在绘图或者计算函数值的时候,我们常常需要生成一些序列,比如生成 0~1000 之间的整数.这时,我们经常用到 Numpy 中的 linspace 和 arange 函数.然而稍不注意,两者就容易用错, ...

  3. C++之dynamic_cast、static_cast、const_cast、reinterpret_cast的用法和区别

    简述 C++中有四个类型转换符,旨在严格限制允许的类型转换,使转换更规范.这四个转换符分别是: dynamic_cast static_cast const_cast reinterpret_cast ...

  4. 详解在group by分组查询中where 和 having的用法和区别。

    我地都知道sql 中 where 和 having 都是用来筛选条件的关键字. 而且having 一般和group by 一齐使用,   但是where 也可以用group by 一齐使用的. 下面用 ...

  5. Perl中use、require的用法和区别

    2019独角兽企业重金招聘Python工程师标准>>> Exporter Module usage                                           ...

  6. 在Linux中su和sudo区别,Linux中su和sudo的用法和区别

    目录 sudo sudo:暂时切换到超级用户模式以执行超级用户权限,提示输入密码时该密码为当前用户的密码,而不是超级账户的密码.缺点是每次执行超级用户权限都要在命令前加上 sudo ,优点是在当前终端 ...

  7. 转:Delphi中destroy, free, freeAndNil, release用法和区别

    http://blog.sina.com.cn/s/blog_44fa172f0101cur1.html 1)destroy:虚方法 释放内存,在Tobject中声明为virtual,通常是在其子类中 ...

  8. Delphi中destroy, free, freeAndNil, release用法和区别

    经过这段时间对delphi中free 和 release 的仔细学习,先总结如下: 1.form.free直接释放资源后,调用OnDestroy事件,但是没有将form指针改为nil 2.form.r ...

  9. vue中slot,slot-scope,v-slot的用法和区别

    以下仅为个人理解,若有不妥请留言评论区 v-slot 指令自 Vue 2.6.0 起被引入,在接下来所有的 2.x 版本中 slot 和 slot-scope attribute 仍会被支持,但已经被 ...

最新文章

  1. 从零开始一起学习SLAM | 为啥需要李群与李代数?
  2. 这38个小技巧告诉你如何快速学习MySQL数据库
  3. 【Linux 内核】CFS 调度器 ④ ( 调度子系统组件模块 | 主调度器、周期性调度器 | 调度器类 )
  4. math and date、ajax、画布
  5. 应用程序_Blazor VS 传统Web应用程序
  6. 容器编排技术 -- Kubernetes Labels 和 Selectors
  7. [大学回忆录]桂X大学大二(上)学期总结
  8. C++对象数组与对象指针的用法【C++初学面向对象编程】
  9. 在eclipse中如何搭建ssh框架
  10. 利用iptables实现SNAT及DNAT
  11. win10 动态磁盘 linux,教你如何将win10系统动态磁盘改成基本磁盘?
  12. hl uoj1841 走格子
  13. ckfinder php,php,ckfinder_ckfinder mac下报错 linux正常,php,ckfinder - phpStudy
  14. 720yun全景图+vue
  15. 算法策略 | MACD跨周期短线交易策略开发(股指+商品双版)
  16. 数据库发展竟然和阿波罗登月有关?还有什么是我们不知道的?
  17. H5/C3基础(2)
  18. 中国云计算厂商TOP30重磅榜单
  19. kindle4用于同步笔记本显示屏成功记录
  20. linux系统宝塔打开异常,宝塔面板进不去,且宝塔面板启动失败,重装宝塔遇见错误...

热门文章

  1. 【C++深度剖析教程11】C++学习之编写代码实现复数类
  2. BUUOJ reverse 刮开有奖
  3. Python3 循环
  4. 在京东上买的手机然后申请退货的经历
  5. PHPCMS 模板的设置
  6. [小技巧][JAVA][转换]整型int与字符char相互转换
  7. [Leetcode][第44题][JAVA][通配符匹配][贪心][动态规划]
  8. 1143. Lowest Common Ancestor
  9. HDU - 5441 Travel 离线处理+并查集
  10. 前端radio单选框默认选中_开发记录篇前端内容1