探索c++中的类型转化

相关引入

C语言中的类型转换:
有相关性的类型之间才能转换:
在这里插入图片描述

非相关性不能转换:
在这里插入图片描述

c++中的转化机制

const_cast

去掉常量属性
在这里插入图片描述

指针相同, 值不相同, 本质是编译器对这个常属性的a做了优化, 因为他觉得常量不会被修改, 所以常量的地址类似宏替换, 不会从内存中去取
让他从内存中去取
用volatile修饰,任何时候都从内存中去取这个值
在这里插入图片描述在这里插入图片描述
但是&a的打印是1, 还是跟编译器有关, 优化不同, 导致bug等情况
在这里插入图片描述%p没有问题, 查看类型猜测是cout没有识别这个类型,同样的错误还有这个
在这里插入图片描述了解即可

reinterpret_cast

用于有一定关联, 但意思不相似的类型:

在这里插入图片描述

static_cast

用于相近的类型转换:

在这里插入图片描述

提升截断本质就是隐式类型的转换

类型转换会产生临时变量
在这里插入图片描述

dynamic_cast

dynamic_cast用于父向子类型的转换(父子的指针转化或者是引用的转化, 对象不行)
向上转型: 子对象给父对象(赋值规则兼容, 不需要转换)
向下转型:父对象给子对象(使用dynamic_cast是安全的)

为什么会存在这个

父类的指针向下转可以指向父类也可以指向子类

?当父类被使用括号强转为子类时, 子类再取访问子类该有的属性, 而父类没有的属性时, 是访问额外的空间, 算是越界访问
所以使用dynamic_cast可以解决这个问题

dynamic_cast的使用, 父类必须要有虚函数, 否则不行
使用dynamic_cast可以从父类转化为子类, 也可以由子类转化为另一个子类, 前提是父类中存在虚函数,且只能转引用或者是指针
子类转化为父类是赋值规则的, 也不需要使用dynamic_cast

其他

RTTI 运行时类型识别(了解)
三种:

在这里插入图片描述

本章必须要了解的内容

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

温有情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值