目录
何为运算符重载?
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
太过抽象了?举个栗子
比如下面这段代码
#include<iostream> uisng namespace; class student{ int num; public: student(int n){ num=n; } }; int main(){ student s1(1); student s2; s2=s1; //利用了隐含的运算符重载“=” }
上面这段代码我们可以看到用student 定义了s1和s2两个对象,s1的num初始值为1,s2=s1则是利用了隐含的运算符重载“=”,将s1的num赋值给了s2的num
为什么需要运算符重载?
上面的例子我们也可以看到运算符重载的作用是”悄无声息“而且“作用巨大”的。
除了上面这个栗子,还能有其他栗子吗?
如果我们定义了运算符重载,增加代码的可读性,达到了一定的封装的目的,可以将其运用于时钟类的自增和自减,线性代数的矩阵加减乘法等等。。。
运算符重载的分类?
解决了为什么需要运算符重载后,我们来看看哪些运算符可以重载
这五个运算符 . .* :: ? : ->* 不能重载,也不能创造新的运算符如 @
以下是可重载运算符
双目算术运算符 + (加),-(减),*(乘),/(除),% (取模) 关系运算符 ==(等于),!= (不等于),< (小于),> (大于),<=(小于等于),>=(大于等于) 逻辑运算符 ||(逻辑或),&&(逻辑与),!(逻辑非) 单目运算符 + (正),-(负),*(指针),&(取地址) 自增自减运算符 ++(自增),--(自减) 位运算符 | (按位或),& (按位与),~(按位取反),^(按位异或),,<< (左移),>>(右移) 赋值运算符 =, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>= 空间申请与释放 new, delete, new[ ] , delete[] 其他运算符 ()(函数调用),->(成员访问),,(逗号),[](下标)
看到这里你会惊叹 编译器的operator在无形中帮助我们干了好多事,所有关于类的运算的,只有你想不到的,没有编译器做不到的
如何运算符重载?
实现方式——1友元函数,2类成员函数
友元函数
#include<iostream> using namespace std; class student{ int num; public: student(){} student(int n){ num=n; } friend student operator+(const student &s1,const student &s2); void show(){ cout<<num<<endl; } }; student operator+(const student &s1,const student &s2){ student s3; s3.num=s2.num+s1.num; return s3; } int main(){ student s1(1); student s2(2); student s3; s3=s2+s1; s1.show(); s2.show(); s3.show(); }
或者类成员函数
#include<iostream> using namespace std; class student{ int num; public: student(){} student(int n){ num=n; } student operator+(const student &s1){//这里 student s; //修改 s.num=s1.num+this->num; //了 return s; //代码 } //了 void show(){ cout<<num<<endl; } }; int main(){ student s1(1); student s2(2); student s3; s3=s2+s1; s1.show(); s2.show(); s3.show(); }
练习题
现在我们学会了,来写几道题目试试把!
1.矩阵相乘(运算符重载)
#include<iostream> using namespace std; int c,n;//c是输入矩阵的次数,n是矩阵的阶数 class myMatrix{ int a[10][10];//可以用int **a; int n;//定义n*n的矩阵 public: myMatrix(int _n){n=_n;} friend myMatrix operator*(myMatrix& c1, myMatrix& c2); void input(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>a[i][j]; } } } void show(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cout<<a[i][j]<<' '; } cout<<endl; } } }; myMatrix operator*(myMatrix& c1, myMatrix& c2){//不用:: int n=c1.n; myMatrix m(n); int sum; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ sum=0; for(int k=0;k<n;k++){ sum+=c1.a[i][k]*c2.a[k][j]; } m.a[i][j]=sum; } } return m; } void function(){ myMatrix m1(n); m1.input(); for(int i=0;i<c-1;i++){ myMatrix m2(n); m2.input(); m1=m1*m2; } m1.show(); } int main(){ cin>>c; cin>>n; function(); return 0; }
2.学生生日差值计算(运算符重载)
#include<iostream> #include<cmath> using namespace std; bool isyear(int year){ return (year%4==0&&year%100!=0 )||(year%400==0); } class date{ public: int year,month,day; date(){} void set(int y,int m,int d){ year=y; month=m; day=d; } int getDayofYear(){// 两个数的只要把他放里面就可以 int sum=day; int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int b[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; for(int i=0;i<month;i++){ if(isyear(year)){ sum+=b[i]; } else sum+=a[i]; } return sum; } int compare(date &d){ int sum=0; // int f1=year*10000+month*100+day; // int f2=d.year*10000+d.month*100+d.day; if(year>d.year){ for(int i=1;i<year-d.year;i++){//不熟 if(isyear(d.year+i) )sum+=366; else sum=+365; } int f=isyear(d.year)?366:365; sum=sum+this->getDayofYear()+f-d.getDayofYear(); } else if(year<d.year){ for(int i=1;i<d.year-year;i++){ if(isyear(year+i) )sum+=366; else sum=+365; } int f=isyear(year)?366:365;//不能直接复制 sum=sum+d.getDayofYear()+f -this->getDayofYear(); } else{ sum=abs(d.getDayofYear()-this->getDayofYear()); } return sum;//8+365-1=372 } }; class student{ string name; date birth; public: student(){} string getname(){return name;} void set(string n,int y,int m,int d){ name=n; birth.set(y,m,d); } friend int operator-(student &s1,student & s2); }; int operator-(student &s1,student & s2){ int s; s=s1.birth.compare(s2.birth);//s1和s2 return s; } int main(){ string name; int y,m,d; int n; cin>>n; student *p=new student[n]; for(int i=0;i<n;i++){ cin>>name>>y>>m>>d; p[i].set(name,y,m,d); } int sum=0,min=0,max=0,s1=0,s2=0; for(int i=0;i<n-1;i++){ for(int j=1;j<n;j++){ sum=p[i]-p[j]; if(sum>max) { max=sum; s1=i; s2=j; } } } //Tom和Jimmy年龄相差最大,为372天。 cout<<p[s1].getname()<<"和"<<p[s2].getname()<<"年龄相差最大,为"<<max<<"天。"; return 0; }
3自增运算符
前缀++
Time operator++ ()
后缀++
Time operator ++(int)