条款27:尽量少做转型动作

来源:互联网 发布:javascript 教程 知乎 编辑:程序博客网 时间:2024/05/04 17:04

C++中的转型语法包括旧式转型和新式转型。

旧式转换包括:

(T) expression //将expression转型为T,C风格的转型动作

T(expression) //将expression转型为T,函数风格的转型动作

新式转型包括:

const_cast<T>(expression)

const_cast通常被用来将对象的常量性转除,也是唯一有此能力的新式转型操作符。

dynamic_cast<T>(expression)

dynamic_cast主要用来执行“安全向下转型”,也就是用来决定某对象是否归属继承体系中的某个类型。它是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。

reinterpret_cast<T>(expression)
reinterpret_cast意图执行低级转型,实际动作(及结果)可能取决于编译器,这也就表示它不可移植。

static_cast<T>(expression)
static_cast用来强迫隐式转换。

结论1:如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts。之所以需要dynamic_cast,通常是因为想在一个认定为derived class对象身上执行derived class操作函数,但手上却只有一个"指向base"的pointer或reference。如果有个设计需要转型动作,试着发展无需转型的替代设计。

可行的dynamic_cast替代方案包括“使用类型安全容器”或“将virtual函数往继承体系上方移动”。

结论2:如果转型是必要的,试着将它隐藏于某个函数背后。客户随后可以调用该函数,而不需将转型放进他们自己的代码内。

结论3:宁可使用C++-style(新式)转型,不要使用旧式转型。新式转型很容易辨识出来,而且也比较有着分门别类的功能。





0 0
原创粉丝点击