将Time类转换为重载的加法运算符很容易,只要将Sum()的名称改为 operator+()即可。这样做是对的,只要把运算符(这里为+)放到 operator的后面,并将结果用作方法名即可。在这里,可以在标识符中使用字母、数字或下划线之外的其他字符。程序清单11.4和程序清单11.5反映了这些细微的修改;
和Sum()一样, operator+()也是由Time对象调用的,它将第二个Time对象作为参数,并返回一个ime对象。因此,可以像调用Sum()那样来调用 operator+()方法:
total=coding.operator+(fixing); //function notation
但将该方法命令为 operator+()后,也可以使用运算符表示法
total=coding+fixing; //operator notation
这两种表示法都将调用 operator+()方法注意,在运算符表示法中,运算符左侧的对象(这里为 coding是调用对象,运算符右边的对象(这里为 fixing)是作为参数被传递的对象。程序清单1.6说明了这一点。
…
总之, operator+()函数的名称使得可以使用函数表示法或运算符表示法来调用它。编译器将根据操作数的类型来确定如何做:
int a,b,c;Time A,B,C;c=a+b; //use int aditionC=A+B; //use addition as defined for Time objects
可以将两个以上的对象相加吗?例如,如果t、t2、t和博都是Time对象,可以这样做吗:
t4=t1+t2+t3; //valid?
为回答这个问题,来看一些上述语句将被如何转换为函数调用。由于+是从左向右结合的运算符,因此上述语句首先被转换成下面这样:
t4=t1,operator+(t2+t3); //valid?
然后,函数参数本身被转换成一个函数调用,结果如下:
t4= t1.operator+(t2.operator+(t3)); //valid? YES
上述语句合法吗?是的。函数调用t2 operator+(3)返回一个Time对象,后者是t2和t3的和。然而,该对象成为函数调用 tl operator-+()的参数,该调用返回t与表示t和t3之和的Time对象的和。总之,最后的返回值为t1、t和t3之和,这正是我们期望的。
