基础篇 | 17 C++ 编程入门(八)类型转换与多重继承

C++ 其它类型转换

前面文章我们讲过dynamic_cast —> RTTI,static_cast;今天再讲讲reinterpret_cast ,const_cast,这些就是C++里面的全部类型转换,这些都熟练掌握后,写C++的类型转换会行云流水。

回顾一下之前:
dynamic cast <-> RTTI(at runtime)
在一条继承链上,向上或向下做类型转换
子类 -> 父类类型,父类类型-> 子类(*)

static_cast 静态转换(在程序编译期就转换好了)、隐式转换

float_t flt = 1.1f;
int32_t num = static_cast<int32_t>(flt);
int32_t num2 = flt; // 不推荐省略
reinterpret_cast 强制类型转换

强制类型转换可以把任何类型转换成我想要的样子,所以强制类型转换很危险。在强制转换之前你一定要知道你在干什么,你不知道就不要进行强制转换了。

// numPtr 内存的是num 这个数字所在的内存地址
int32_t numPtr = &num; // 0x000fffed (我随便写的一个地址)

// 把一个指针强制转换成一个类型
int64_t numPtrAsInt = reinterpret_cast<int64_t>(numPtr);

大家看看我这样写行不行

BaseClass* bC1 = reinterpret_cast<BaseClass*>(sC1);
SubClass* sC2 = reinterpret_cast<SubClass*>(bC2);
// 注意:代码可以编译通过,也可以执行。但是不可以这样写
//      会导致 RTTI error!程序的执行行为不可预测。 

我可以将子类强制转换为父类,或将父类强制转换为子类吗?
答案是不可以,强制类型转换不会像dynamic_cast一样做动态指针转换。所以在程序运行阶段会出现莫名错误,难以查找原因。

Best Practice
内存当中的地址一般情况下是不是唯一的,内存是连续的,里面的地址肯定是唯一的。很多时候呢我们会利用程序里面内存对象的首地址,把它cast成一个整型或一个数字作为它的UUID。UUID唯一标识符。怎么做,把一个指针转化成一个整型来做。尤其是开发分布式系统的时候,UUID是不是很重要呀。在某些场景下很重要,我这里建议也不要随意使用reinterpret_cast,很危险,除非你对这里面的东西很清楚,你也知道你要做什么事情。

不同电脑的地址不会存在重复吗?
会的,我们在UUID的基础上再增加别的东西,比如IP地址。公网上我们可以用IP地址,如果是内网,内网和外网有可能重复吗,其实一般也不会,网段不一样。如果IP地址还能重复的话,我们写硬件的Mac地址。

const_cast

看这一段代码:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值