第八课

1,意义:

·运算符重载,就是赋予运算符新的含义,和函数重载一样,一个函数名可以用来代表不同功能的函数;·

·运算符重载是为了解决类对象之间的运算符,通常的运算符只用于算术运算,如常量int之间,因为编译器已经定义了,而一个类两个对象之间成员进行运算必须重新定义,让编译器在遇到对象运算时能按我们要求进行运算

2,运算符重载限制

1,可以重载的运算符

算术运算符: + - * / %
自增、自减运算符: ++ –
位运算符: | & ~ ^ << >>
关系运算符: == != < ><= >=
赋值运算符: = += -= /= %= |= ^= <<= >>=
单目运算符: + - * &
动态内存分配: new delete new[] delete[]
其他运算符 () -> . []
逻辑运算符: || && !

2,不能重载的运算符

成员访问运算符: .
域运算符: ::
成员指针访问运算符: .* ->*
长度运算符: sizeof
条件运算符: ? :
预处理符号: #

3,运算符重载规则

1,重载运算符函数可以对运算符作出新的解释,但原有基本语义不变;

·不改变运算符的优先级;

·不改变运算符的结合性;

·不改变运算符所需要的操作数;

·不能创建新的运算符;

4,运算符重载语法

返回类型 类名::operator op(参数列表)
{
    //对应运算符的操作
}
注意:一个运算符被重载后,原有意义没有失去,只是定义了相对特定类的一个新运算符;

5,运算符重载的两种方法

1,运算符可以重载为两种函数,成员函数或友元函数;

2,两种形式的选择时机

·左操作数(或者只有左操作数时),是本类的对象时,可选成员函数形式;

·左操作数不是本类的对象,必须采用非成员函数形式,一般是友元函数;

·一般单目运算符最好被重载为成员函数,双目运算符重载为友元函数;

·具有可交换性的双目运算符最好两种形式都有(成员函数时适用左操作数为本类对象,友元函数时适用左操作数为其他类的对象);

6,单目运算符重载

·二元运算符:

ObjectL op ObjectR //ObjectL为左操作数 ,ObjectR为右操作数,op为运算符;

·重载为成员函数,解释为:

Object.operator op(ObjectR) ;

·重载为友元函数:

operator op(ObjectL,ObjectR);