运算符重载
运算符重载基础:运算符重载就是对已有的运算符赋予新的含义,实现新的功能。<<是C++中的左移运算符,但是在输出操作中与cout配合被称为流插入运算符,可以进行输出。>>是右移运算符,与cin配合使用被称为流提取运算符。它们都被称为运算符重载。我们也可以根据我们的需要对C++中现有的运算符进行重载,来赋予这些运算符新的含义。
运算符重载的规则
被重载的运算符必须是已经存在的C++运算符,不能重载自己创建的运算符。
运算符被重载之后,原有功能仍然保留。只是扩展了原有功能。
重载不能改变运算符运算对象的个数。+运算符具有两个操作数,在+运算符函数作为CTime的成员函数的时候,有一个参数是隐含的,也就是当前的对象,使用this来引用。另一个参数通过函数参数指定。
可以重载的运算符:
1.算术运算符:+,-,*,/,%,
2.逻辑运算符:&&,||,!
3.关系运算符:>,<,=,>=,<=,==,!=
4.位操作符:~,<<,>>,&,^),|
5.自增自减运算符:++,–
6.复合赋值运算符:+=,-=,*=,/=,%=
7.其他:&、*、 () 、-> 、[]、.new/delete、>>、<<不能重载的运算符: ?: . * :: sizeof 不需要重载的运算符:=(赋值)和&(取地址符) 赋值函数
对于运算符重载有两种方法:一种是友元函数,一种是成员函数,但什么时候应该使用友元函数,什么时候应该使用成员函数方式呢?友元函数函数形式的运算符函数,用以访问类的私有数据成员。这样可以减低开销,但破坏封装性。因此建议尽量使用成员函数形式。一般将单目运算符重载为成员函数,将双目运算符重载为友元函数。
1、成员函数方式要求左侧的参数要与类类型相同,如下“+”的重载:
objectX+objectY——>编译器解释为objectX.operator+(objectY),operator+是objectX的方法,它的参数为一个对象objectY;2、友元函数则要求实参顺序与形参类型顺序一致。 如
objectX+objectY——>编译器解释为operator+(objectX,objectY),operator+为objectX和objectY对象所属类的一个友元函数,友元函数可以访问类的私有成员。有的运算符必须定义为类的成员函数:=、[]、() 有的运算符不能定义为类的成员函数,只能定义为类的友元:<<、>>
运算符重载可以执行任意的操作,比如可以将+定义成两个对象相减的操作,但是这样违背我们日常使用的习惯,容易使用误用,减低程序可读性,因此必须保证重载的运算符与该运算符应用于标准数据类型时所具有的功能。
所谓双目运算符就是具有两个操作数的运算符。如 +、-、==等
重载双目运算符时,运算符函数中应该具有两个参数,若运算符函数作为类的成员函数,则只需要一个参数。
所谓单目运算符就是具有一个操作数的运算符。如 !、++、–、+=等,注意:这两个有前缀后缀之分。在参数列表中加一个int即可为后缀++/–.
重载单目运算符时,运算符函数中应该具有一个参数,若运算符函数作为类的成员函数,则没有参数。