理解本条款内容之前需要先看一个例子:
class UPint
{
public:
UPint();
UPint(int value);
....
}
const UPint operator+(const UPint& lhs,const UPint& rhs);
UPint u1,u2;
UPint u3 = u1 + u2;//这没什么可讨论的,可以执行。
UPint u4 = 10+u2;
UPint u4 = u2+10;
以上例子也可以成功,它们之所以成功在于该语句产生了临时对象,并将整数10转换为UPint。
由编译器来执行此类隐式转换,很方便,但是此类转换会产生临时对象,从而产生我们不想要的运行成本。我们并不想进行隐式类型转换,我们想要的结果仅仅是为了能够使一个UPint类型与一个int类型能够进行operator+类型重载而已。如果我们想要能够对UPint和int进行加法,我们需要做的就是多声明几个重载函数,每个函数拥有不能的参数。如下列所示:
const UPint operator+(const UPint& lhs,const UPint& rhs);
const UPint operator+(cosnt UPint& lhs,int rhs);
const UPint operator+(int lhs,const UPint& rhs);
结论:使用函数重载来避免隐式类型转换所产生的临时对象,从而提高程序运行效率不仅仅局限运用在操作符函数身上。在大部分程序中,如果可以接受一个char*,你可能会希望也接受一个string对象。