C++动态类型转换--少用类型转换

本文介绍了C++中的四种强制类型转换函数:const_cast、static_cast、dynamic_cast和reinterpret_cast。重点讨论了它们各自的应用场景,如const对象的转换、基类与派生类间的转换以及不同类型间的低级别转换。dynamic_cast提供了安全的向下转型,但效率可能较低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++动态类型转换–少用类型转换


前言

宁可用c++风格的新式转换const_cast , static_cast , dynamic_cast , reinterpret_cast,也不用旧式转换,如T(expression)


C++动态类型转换–少用类型转换

const_cast , static_cast , dynamic_cast , reinterpret_cast

二、C++ 四种强制转换类型函数

1.const_cast

因为不能把一个const变量直接赋给一个非const变量,必须要const_cast转换。

1、常量指针被转化成非常量的指针,并且仍然指向原来的对象;
2、常量引用被转换成非常量的引用,并且仍然指向原来的对象;
3、const_cast一般用于修改指针。如const char *p形式。

常量对象(或基本类型**)不可以被转换**成非常量对象(或基本类型)

2.static_cast

static_cast 作用和C语言风格强制转换的效果基本一样,由于没有运行时类型检查来保证转换的安全性,所以这类型的强制转换和C语言风格的强制转换都有安全隐患。
用于类层次结构中基类(父类)和派生类(子类)之间指针或引用的转换。注意:进行上行转换(把派生类的指针或引用转换成基类表示)是安全的;进行下行转换(把基类指针或引用转换成派生类表示)时,由于没有动态类型检查,所以是不安全的。

用于基本数据类型之间的转换,如把int转换成char,把double转换成int。这种转换的安全性需要开发者来维护
static_cast不能转换掉原有类型的const、volatile、或者 __unaligned属性。(前两种可以使用const_cast 来去除)
c++ primer 中说道:c++ 的任何的隐式转换都是使用 static_cast 来实现。

3.dynamic_cast

dynamic_cast主要执行安全向下转型,这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针,说明dynami_cast 在程序运行时对类型转换对“运行期类型信息”(Runtime type information,RTTI)进行了检查.

使用dynamic_cast转换的Base类至少带有一个虚函数

对于“向下转型”有两种情况。

3.1 指针转换

一种是基类指针所指对象是派生类类型的,这种转换是安全的;
另一种是基类指针所指对象为基类类型,在这种情况下dynamic_cast在运行时做检查,转换失败,返回结果为0;

3.2 引用类型

在引用上,dynamic_cast依旧是常用于“安全的向下转型”。与指针一样,引用的向下转型也可以分为两种情况,与指针不同的是,并不存在空引用,所以引用的dynamic_cast检测失败时会抛出一个bad_cast异常

dynamic_cast 许多版本很,如某个版本基于“class名称之字符串比较” 如果你在四层深的单继承体系内的某个对象执行dynamic_cast ,可能会调用4次strcmp

4.reinterpret_cast

reinterpret_cast是强制类型转换符用来处理无关类型转换的,通常为操作数的位模式提供较低层次的重新解释!但是他仅仅是重新解释了给出的对象的比特模型,并没有进行二进制的转换!
他是用在任意的指针之间的转换,引用之间的转换,指针和足够大的int型之间的转换,整数到指针的转换

reinterpret_cast执行低级转型,实际动作取决与编译器,意味着不可移植

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值