c++运算符重载(复习)

本文详细介绍了C++中的运算符重载,包括为什么要重载运算符、哪些运算符可以重载以及如何通过友元函数和类成员函数实现运算符重载。通过矩阵相乘、学生生日差值计算和自增运算符等实例,深入浅出地展示了运算符重载的应用。
摘要由CSDN通过智能技术生成

目录

何为运算符重载?

 为什么需要运算符重载?

 运算符重载的分类?

如何运算符重载?

友元函数

 或者类成员函数

练习题

1.矩阵相乘(运算符重载)

2.学生生日差值计算(运算符重载)

3自增运算符



何为运算符重载?

运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。

太过抽象了?举个栗子

比如下面这段代码

#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在无形中帮助我们干了好多事,所有关于类的运算的,只有你想不到的,没有编译器做不到的

详解c++中对二维数组下标[][]的重载 - 机智的小小帅 - 博客园 (cnblogs.com)

如何运算符重载?

实现方式——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)

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值