声明:
- 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。
- 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。
条款27:尽量少做转型动作
Minimize casting.
C风格转型动作(旧式转型):
- (T)expression
- T(expression)
C++提供了四种新式转型:
- const_cast<T>(expression):用来将对象的常量性转除,只有它能办到
- dynamic_cast<T>(expression)
- reinterpret_cast<T>(expression)
- static_cast<T>(expression):用来强制隐式转换,如将non-const转化为const对象,将int转化为double,将void*转化为typed指针,将pointer-to-base转化为pointer-to-derived等。
旧式转换仍然合法,但新式转换更受欢迎。唯一使用旧式类型转换的时机是,当要调用一个explicit构造函数将一个对象传递各一个函数时,eg:
class Widget
{
public:
explicit Widget(int size);
...
};
void doSomething(const Widget& w);
doSomething(Widget(15));
doSomething(static_cast<Widget>(15));
请记住:
- 如果可以,尽量避免转型,特别是在注重效率的代码中避免dynamic_casts。如果有个设计需要转型动作,试着发展无需转型的替代设计。
- 如果转型是必要的,试着将它隐藏于某个函数背后。客户可以随时调用该函数,而不需要将转型放进他们自己的代码内。
- 宁可使用C++style(新式)转型,不要使用旧式转型。前者很容易辨认出来,而且也比较有着分门别类的职掌。