2.4 运算符重载
在程序设计中,我们书写涉及运算符+、*、 <的表达式时,会使用中缀记号将运算符放置在两个运算数之间。>
//op是运算符;lhs,rhs是左运算数和右运算数
lhs op rhs
中缀表达式对应于将其运算数作为参数的运算符函数。运算符函数的原型是:
returnType operator op (type1 lhs , type2 rhs);
2.4.2 运算符可以重载为自由函数或类成员函数,自由函数的实现必须能够访问类的公有成员函数。
2.4.3 将运算符重载为自由函数将提高效率。因为这个函数独立于类,所以,她的实现必须使用成员函数访问合适的数据成员。如果类不提供合适的访问函数,则运算符不能重载为自由格式函数。c++语言允许在类中将自由格式函数声明为友元函数。她是可以使用类中私有成员的自由函数。在类中声明这种函数,直接在函数原型前加关键字friend。尽管可以使用类的私有成员,但友元不是类的成员函数。
友元函数可以通过嵌入码或外部函数来实现。在后一种情况下,关键字friend不包含在函数头中。因为友元函数不是雷成员函数,所以,外部实现不包括类作用域运算符“className::”。
声明+运算符的多个版本为程序员使用多种运算数增加对象的时间提供了灵活性。编译器通过比较运行时参数的数据类型和形参的数据类型,来选择合适的运算符版本。
2.4.4 重载数据流IO运算符
文件具有istream 和ostream这两个类,分别提供数据流输入和数据流输出。这些类为基本类型char,int,short,long,float,double声明数据流运算符<<,>>。这些都是二元运算符,做运算数是数据流,右运算数是变量或字面值。
对于输出,< <读取右边变量的数值,并插入数据流中,但不改变他的数值。对于输入,> >将数据从数据流取出,并用他更新变量的数值。
输出:<<:
ostream& operator<< (ostream& ostr, const classname& obj);
输入(>>):
istream& operator>> (istream& istr, classname& obj);
在这种情况下,IO数据流对象是表达式中的左运算数。执行数据流中的操作会改变它的状态,所以按引用传递返回的数据流对象。
输出操作只使用对象的数值,所以通过常量引用传递对象。
输入操作更新对象,所以对象按引用传递
2.4.5 成员函数的重载
一条原则:使用成员函数重载任何其操作改变对象本身的二元运算符。
如+=
例如:time24& operator += (const time24& rhs);
由于+=是二元运算符,所以,你可能注意到少了 一个参数。成员函数重载减少了一个参数,因为对象本身就是一个运算数。而且,返回用引用类型。
c++使用关键字this表示内存中对象的地址。表达式*this标识对象本身。*this是当前对象,以及成员函数体中任何语句可以使用*this标识对象。