C++编程规范之29:考虑重载,以避免隐式类型转换
摘要:
如无必要勿增对象:因素类型转换提供了语法上的便利。但是如果创建临时对象的工作并不不要而且适于优化,那么可以提供签名与常见参数类型精确匹配的重载函数,而且不会导致转换。
隐式转换最常见的例子是字符串的比较,见如下程序:
class string { //...... String(const char* text); }; booloperator==(const String&, const String&); //......代码中的某处...... if (something =="Hello") { ...... }
上述代码中,编译器将进行比较操作,但是“==”操作符的两边都是conststring,这时就会进行隐式转换,从char*隐式转换到string。这样会对程序的性能造成很大的影响,隐式转换操作会复制字符,但是我们只是比较,没有必要复制。
这一个问题的解决方法是:定义重载以避免转换。
booloperator==(const String& lhs, const String& rhs); booloperator==(const String& lhs, const char* rhs); booloperator==(const char* lhs, const String& rhs);
这样看起来会有重复代码,但是这只是“签名重复”而已,因为所有三个重载通常都使用相同的后端函数。这样的简单重载,使你不可能掉入不成熟的优化的陷阱,而且提供它们只是小菜一碟,尤其是在设计程序库的时候,这时想要提前预测在性能敏感的代码中将出现哪些常见类型是很困难的。
最后更新:2017-04-03 12:53:54