编程交流与学习--More Effective C++的学习-Item M2:尽量使用C++风格的类型转换

本文详细介绍了C++中的四种类型转换操作符:static_cast、const_cast、dynamic_cast和reinterpret_cast的功能与使用场景,并对比了它们与C风格类型转换的区别。

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

C风格的类型转换:一来它们过于粗鲁,能允许你在任何类型之间进行转换。不过如果要进行更精确的类型转换,这会是一个优点。二来C风格的类型转换在程序语句中难以识别。

C++通过引进四个新的类型转换操作符克服了C风格类型转换的缺点, static_cast, const_cast, dynamic_cast, reinterpret_cast(type) expression ==》static_cast<type>(expression)

static_cast在功能上基本上与C风格的类型转换一样强大,含义也一样。它也有功能上限制。例如,你不能用static_cast象用C风格的类型转换一样把struct转换成int类型或者把double类型转换成指针类型,

static_cast不能从表达式中去除const属性,因为另一个新的类型转换操作符const_cast有这样的功能。

const_cast用于类型转换掉表达式的constvolatileness属性。到目前为止,const_cast最普通的用途就是转换掉对象的const属性。

dynamic_cast,它被用于安全地沿着类的继承关系向下进行类型转换。这就是说,你能用dynamic_cast把指向基类的指针或引用转换成指向其派生类或其兄弟类的指针或引用,而且你能知道转换是否成功。失败的转换将返回空指针(当对指针进行类型转换时)或者抛出异常(当对引用进行类型转换时)。dynamic_casts在帮助你浏览继承层次上是有限制的。它不能被用于缺乏虚函数的类型上(参见条款M24),也不能用它来转换掉constness

如你想在没有继承关系的类型中进行转换,你可能想到static_cast。如果是为了去除const,你总得用const_cast

reinterpret_cast。使用这个操作符的类型转换,其的转换结果几乎都是执行期定义(implementation-defined)。因此,使用reinterpret_casts的代码很难移植。reinterpret_casts的最普通的用途就是在函数指针类型之间进行转换。

正是因为新的类型转换符缺乏美感才能使它弥补了在含义精确性和可辨认性上的缺点。使用新类型转换符的程序更容易被解析(不论是对人工还是对于工具程序),它们允许编译器检测出原来不能发现的错误。这些都是放弃C风格类型转换方法的强有力的理由。还有第三个理由:也许让类型转换符不美观和键入麻烦是一件好事。

Stl中的宏定义:

#  ifndef  _STLP_NO_NEW_STYLE_CASTS

#   define __CONST_CAST(__x,__y) const_cast<__x>(__y)

#   define __STATIC_CAST(__x,__y) static_cast<__x>(__y)

#   define __REINTERPRET_CAST(__x,__y) reinterpret_cast<__x>(__y)

#   define __DYNAMIC_CAST(__x,__y) dynamic_cast<__x>(__y)

#  else

#   define __STATIC_CAST(__x,__y) ((__x)(__y))

#   define __CONST_CAST(__x,__y) ((__x)(__y))

#   define __REINTERPRET_CAST(__x,__y) ((__x)(__y))

#   define __DYNAMIC_CAST(__x,__y) ((__x)(__y))

#  endif

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值