剑指offer c++类型转换关键字与volatile

C采用强制转换方式
TYPE b = (TYPE) a
c++除了可使用c语言的转换方式,不同场合使用不同的类型转换关键字

static_cast<new_type>      (expression)
dynamic_cast<new_type>     (expression) 
const_cast<new_type>       (expression) 
reinterpret_cast<new_type> (expression)

new_type为目标数据类型,expression表示原始数据类型变量

1、const_cast常量转换
const类型的变量使用,使得常量可修改。消除转换类型的const和volatile属性。

2、static_cast静态转换
类似于c语言强制类型转换
static_cast不能去掉类型的const、volitale属性(用const_cast)。
(1)子类转父类安全,父类转子类不安全
(2)基本数据类型直接的转换
(3)空指针转换为目标类型空指针
(4)任何类型转为void

3、dynamic_cast动态转换
new_type必须是类的指针,类的引用或空指针,相对应的expression。

4、reinperpret_cast
new_type必须是指针、引用、算数类型、函数指针,成员指针。它可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针(先把一个指针转换成一个整数,在把该整数转换成原类型的指针,还可以得到原先的指针值)

dynamic_cast: 通常在基类和派生类之间转换时使用;
const_cast: 主要针对const和volatile的转换.
static_cast: 一般的转换,如果你不知道该用哪个,就用这个。
reinterpret_cast: 用于进行没有任何关联之间的转换,比如一个字符指针转换为一个整形数

参考链接:
https://www.cnblogs.com/chenyangchun/p/6795923.html
http://blog.sina.com.cn/s/blog_4a84e45b0100f57m.html
http://luvinahlc.github.io/2015/11/19/cast-CPP/

补充:volatile
保证多线程读取数据的时候是最新的。如果没有volatile修饰,线程最先从缓存中读取,如果在处理器的缓存中存在该数据,就直接读取缓存内数据,如果没有才去内存中取,对这个数据操作完,会将操作完的数据放入缓存中,而不是马上放到内存中。在两个线程同时对某一数据操作时,一个线程对这个数据做出了改变,只是将数据放到了自己的缓存里,没有存到内存里,另一个线程读取数据时就不是最新的。加了volatile后,线程读取数据时强制从内存中取,也会在数据做出改变时立刻将数据放到内存中。

1、保证此变量对所有线程的可见性
2、禁止指令重排优化。指令重排:cpu采用了允许将多条指令不按照程序规定的顺序分开发送给各相应的电路处理单元。

参考链接
https://blog.csdn.net/wangbiao007/article/details/52764868
https://blog.csdn.net/weixin_38261597/article/details/88734972

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值