要重载操作符,需使用被称为操作符函数的特殊函数形式。
操作符函数格式:operator op(argument-list),其中op是要重载的操作符。op须是有效的C++操作符,不能虚构一个新的符号。
在操作符表示法中,操作符左侧的对象是调用对象,右边的对象是作为参数被传递的对象。
重载+运算符,t4=t1+t2+t3;
由于+是从左至右结合的操作符,上述语句首先被转化成:t4=t1.operator+(t2+t3);
然后,函数本身被转换成一个函数调用:t4=t1.operator+(t2.operator+(t3));
操作符重载的限制:
1.重载后的操作符必须至少有一个操作符是用户定义的类型。
2.使用操作符时不能违反操作符原来的句法规则,例如不能把一个二元操作符重载成一元操作符,也不能改变操作符的优先级。
3.不能定义新的操作符。
4.大多数操作符可以通过成员或非成员函数进行重载,但=、()、[]、->只能通过成员函数进行重载。
对非成员重载操作符函数来说,操作符表达式左边的操作数对应于操作符函数的第一个参数,右边的操作符对应于第二个参数。使用非成员函数可以按所需的顺序获得操作数,但引发了一个新问题:非成员函数不能访问类的私有数据,因此创建了友元函数。
创建友元函数的第一步是将其原型放在类声明中,并在原型前加上关键字friend:
friend Time operator* (double m,const Timer &t);
虽然operator*()函数是在类声明中定义的,且与成员函数的访问权限相同,但它并不是成员函数,因此不能使用成员操作符来调用。
因为它不是成员函数,因此不能用Time::限定符,也不能在定义中使用关键字friend:
Timer operator* (double m,const Time &t){}