C++类型转换整理

C++类型转换

C++类型转换主要分为两种:隐式类型转换、显式类型转换(强制类型转换)。

隐式类型转换

各种情况的隐式类型转换,都满足了一个基本原则:由低精度向高精度的转换。

显式类型转换(强制类型转换)

四种强制类型转换操作符:static_cast、const_cast、reinterpret_cast、dynamic_cast。

转换类型操作符作用
static_cast无条件转换,静态类型转换
const_cast去掉类型的 const 或 volatile 属性
reinterpret_cast仅重新解释类型,但没有进行二进制的转换
dynamic_cast借助 RTTI,用于类型安全的向下转型

static_cast 静态类型转换

所谓的静态,即在编译期内即可决定其类型的转换,用的也是最多的一种。

  1. 基本数据类型间的转换,例如 short 转 int
  2. void 指针和具体类型指针之间的转换,例如 void* 转 int*、char* 转 void* 等;
  3. 不能用于无关类型之间的转换

const_cast 去掉const属性转换

去掉类型的const或volatile属性(基本没啥用)

reinterpret_cast 重新解释类型转换

最普通的用途就是在函数指针类型之间进行转换。
可以把一个指针转换成一个整数,也可以把一个整数转换成一个指针
(风险很高)

dynamic_cast 子类与父类之间的多态类型准换

其他三种都是编译时完成的。dynamic_cast是运行时处理的,运行时要进行类型检查。

dynamic_cast
转换成功:返回的是指向类的指针或引用。
转换失败:返回NULL(指针)或 bad_cast 异常(引用)。

向上转换:将派生类赋值给基类
在向上转换时,安全,无需 RTTI ,此时 dynamic_cast 和 static_cast 的效果是一样的。

向下转型:将基类赋值给派生类

向下转型是有风险的,dynamic_cast 会借助 RTTI 信息进行检测,确定安全才能转换成功,否则就
转换失败。

dynamic_cast 会在程序运行过程中遍历继承链,如果途中遇到了要转换的目标类型,那么就能够转换成功,如果直到继承链的顶点(最顶层的基类)还没有遇到要转换的目标类型,那么就转换失败。对于同一个指针,它指向的对象不同,会导致遍历继承链的起点不一样,途中能够匹配到的类型也不一样,所以相同的类型转换产生了不同的结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值