一.在未学习操作运算符以前,我不能理解既然编译系统会根据表达式的形式选择调用与之匹配的运算符重载函数,为什么我们还要再次定义一个重载运算符的函数?学了以后有了一个初步的认识
1.我们在不改变操作运算符功能的情况下,对其赋予新的含义,,实现新的功能,比如复数的加减法中
2.通过重载可以把功能相似的几个函数合为一个,使程序更加简洁高效
3.由于一般数据类型间的运算符没有重载的必要,所以运算符重载基本上是面向对象的,在进行对象之间的运算时,程序通过调用运算符相应的函数进行处理,实现数据共享,但也不影响c++所看重的封闭性
二.运算符重载的方法:
1.由于运算符重载主要针对的是对象之间的运算,所以可以有两种方式:成员函数,友元函数
成员函数:在函数体中定义一个对象,如:complex add(Complex &c) {c.fenzi=this->fenzi+c.fenzi}
但是一定要注意1,如果参数不是类,如:complex add(int &i),在成员函数中因为有this指针,return(this->fenzi+i),而在友元函数中complex add(int &i,complex &c){c.fenzi=c.fenzi+i}
注意2在重载中一般不要想当然的乱用交换律,比如在复数运算中,定义无对象参数的成员函数,你要用交换率,编译一定会有问题
注意3“=”“[]”"()""->"必须作为成员函数重载;
“<<”">>",类型转化运算符中必须要用到友元函数重载;
友元函数:友元函数没有this指针,所以要有两个参数,如:complex add(Complex &c,Complex &d)
{fenzi=c.fenzi+d.fenzi}
三重载运算符有很多规则
1.所谓重载,就是对已经存在的进行升级,不能定义新的运算符
2.有些运算符不能重载,如:.(成员访问运算符),*(成员指针访问运算符),::(域运算符),sizeof(长度运算符),?:(条件运算符)
3.重载不能改变运算对象的个数(比如双目运算符,单目运算符)
4.重载不能改变优先级
5.重载不能有默认的参数
6.重载的运算符必须和对象一起使用,其参数至少有一个是类对象
四疑问:重载运算符只能在类里面来定义吗???查阅资料显示可以在类外面定义,但是它一定要与对象建立一定的联系,前面就说过,它在类里面才有意义