More Effective C++读书笔记:条款21

Aki 发布于 2022-10-19 268 次阅读


21利用重载技术(overload)避免隐式类型转换:

原因:

  • 隐式类型转换产生临时对象带来一些我们并不想要的成本

例如:

class Obj
{
public:
  Obj(){}
  Obj(int val){}
}

const Obj operator+(const Obj & lhs, const Obj & rhs);
Obj obj1, obj2;
Obj obj3 = obj1 + 10;  // 这里之所以不报错时因为10通过隐式转换成Obj类型的对象

上述隐式转换的前提是class中有相关有参构造函数

优化:

声明数个函数,考虑各种情况的参数类型,每个函数有不同类型的参数表,来消除隐式类型转换的需求

const Obj operator+(const Obj & lhs, int rhs);
const Obj operator+(int lhs, const Obj & rhs);
Obj obj3 = obj1 + 10;    // 不会产生临时对象
Obj obj3 = 10 + obj1;    // 不会产生临时对象

总结:

根据80-20法则,增加一大堆重载函数不见得是件好事,除非使用重载函数后,程序的整体效率有重大改善