C++ 尽量少做转型动作

20180315 C++ 尽量少做转型动作


C++规则的设计目标之一是:保证“类型错误”绝不可能发生。


C、Java和C#阵营中的转型(casting)比较必要而无法避免,也比较不危险(与C++相比),但C++中的转型是一个你会想带着极大尊重区亲近的一个特征。


C++提供四种新式转型(常常被称为new-style或C++-style casts):
const_cast<T>(expression)
dynamic_cast<T>(expression)
reinterpret_cast<T>(expression)
static_cast<T>(expression)


const_cast通常用于将对象的常量性转除,它也是唯一有此能力的C++-style转型操作符(重点:常量性转除)。
dynamic_cast主要用于执行“安全向下转型”,也就是用于决定某对象是否归属于继承体系中的某个类型。它是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作(重点:向下转型、继承体系)。


reinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编译器,这也就表示它不可移植,例如将一个pointer to int转型成int。这一类转型在低级代码意外很少见(重点:低级转型、pointer to int转型成int)。


static_cast用来强迫隐式转换,如将non-const对象转换成const对象,或将iint转换成double等等。它也可以用来执行上述多种转换的反向转换,如将void*指针转换成typed指针,将pointer-to-base转换成pointer-to-derived。但它无法将const转换成non-const,这只有const-casr才能办到(重点:强迫隐式转换,将non-const对象转换成const对象、执行上述多种转换的反向转换)。










优良的C++代码很少使用转型,但若说要完全摆脱他们又太过不切实际。
我们应该尽可能隔离转型动作,通常是把它隐藏在某个函数内,函数的接口会保护调用者不受函数内部任何肮脏龌龊的动作影响。


注意:
1、如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts。
如果有个设计需要转型动作,试着发展无需转型的替代设计。
2、如果转型是必须的,试着将他隐藏于某个函数背后。客户随后可以调用该函数,而不需将转型放进它们自己的代码内。
3、宁可使用C++-style(新式)转型,不可使用旧式转型。前者很容易辨识出来,而且也比较有着分门别类的辨识功能。
4、










































































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值