IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++运算符重载(复习) -> 正文阅读

[C++知识库]c++运算符重载(复习)

目录

何为运算符重载?

?为什么需要运算符重载?

?运算符重载的分类?

如何运算符重载?

友元函数

?或者类成员函数

练习题

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

如何运算符重载?

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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:05:10  更:2021-11-28 11:05:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:25:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码