C++同时提供4种新的强制类型转换形式const_cast、dynamic_cast、 reinterpret_cast和 static_cast

本文深入探讨了C++中四种新风格的类型转换:dynamic_cast、static_cast、const_cast和reinterpret_cast。每种转换都有其特定用途,如dynamic_cast用于安全的向下转型,static_cast用于基础类型间的转换等。文章通过实例解释了这些转换如何工作。

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

C++同时提供了4种新的强制类型转换形式(通常称为新风格的或C++风格的强制转 型):const_cast(expression)、dynamic_cast(expression)、 reinterpret_cast(expression)和 static_cast(expression),每一种都适用于特定的目的,具体如下:

(1)dynamic_cast 主要用于执行“安全的向下转型(safe downcasting)”,也就是说,要确定一个对象是否是一个继承体系中的一个特定类型。支持父类指针到子类指针的转换,这种转换时最安全的转换。它 是唯一不能用旧风格语法执行的强制类型转换,也是唯一可能有重大运行时代价的强制转换。

(2)static_cast 可以被用于强制隐形转换(例如,non-const对象转换为const对象,int转型为double,等等),它还可以用于很多这样的转换的反向转换 (例如,void*指针转型为有类型指针,基类指针转型为派生类指针),但是它不能将一个const对象转型为non-const对象(只有 const_cast能做到),它最接近于C-style的转换。应用到类的指针上,意思是说它允许子类类型的指针转换为父类类型的指针(这是一个有效的隐式转换),同时,也能够执行相反动作:转换父类为它的子类。

在这最后例子里,被转换的父类没有被检查是否与目的类型相一致。
代码:

class Base {};
class Derived : public Base {};

Base *a = new Base;
Derived *b = static_cast<Derived *>(a);

'static_cast’除了操作类型指针,也能用于执行类型定义的显式的转换,以及基础类型之间的标准转换:
代码:

double d = 3.14159265;
int i = static_cast<int>(d);

(3)const_cast一般用于强制消除对象的常量性。它是唯一能做到这一点的C++风格的强制转型。这个转换能剥离一个对象的const属性,也就是说允许你对常量进行修改。

代码:

class C {};
const C *a = new C;
C *b = const_cast<C *>(a);

(4)reinterpret_cast 是特意用于底层的强制转型,导致实现依赖(就是说,不可移植)的结果,例如,将一个指针转型为一个整数。这样的强制类型在底层代码以外应该极为罕见。操作 结果只是简单的从一个指针到别的指针的值得二进制拷贝。在类型之间指向的内容不做任何类型的检查和转换。

旧风格 的强制转型依然合法,但是新的形式更可取。首先,在代码中它们更容易识别(无论是人还是像grep这样的工具都是如此),这样就简化了在代码中寻找类型系 统被破坏的地方的过程。其次,更精确地指定每一个强制转型的目的,使得编译器诊断使用错误成为可能。例如,试图使用一个const_cast以外的新风格 强制转型来消除常量性,代码将无法编译。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值