Effective C++之条款27:尽量少做转型动作

声明:

  1. 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。
  2. 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。

条款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));

请记住:

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

猜你喜欢

转载自blog.csdn.net/longmenshenhua/article/details/89081680