C++四则运算符与关系运算符的重载

不打扰是莪最后的温柔 提交于 2020-02-21 05:45:24
#include<iostream>
#include<cstdlib>
#include<stdlib.h>
#include<string>
using namespace std;

class Couple{
    private:
        int a,b;
    public:
        Couple(int a=0,int b=0):a(a),b(b){cout<<"Call constructor"<<endl;}
        Couple operator+(const Couple& c);
        Couple operator*(const int& k);
        Couple operator*(const Couple& c);
        friend bool operator==(const Couple& c1,const Couple& c2){return (c1.a==c2.a)&&(c1.b==c2.b);}
        friend Couple operator*(const int& k,const Couple& c);//由于成员函数的操作符重载要求左操作数必须是Couple本类的
        //一个对象,所以不支持整数左乘对象的形式,因此对于这种情形,可以将这种乘法定义为友元函数去重载
        Couple operator-(const Couple& c);//参数可以不是Couple类型的引用,但是如果不采用引用传递,就会变成值传递
        //值传递就会产生对象的拷贝动作,降低效率,也可以不采用常引用,但是如果这个引用它引用的变量不是常量,那么
        //如果还不采用常引用的话,就可以在函数内部修改所引用的变量的值,这是不太允许的。
        Couple operator/(const int k);
        void Show(){
            cout<<a<<" "<<b<<endl;
        }
};
//由于是friend,所以不需要指明类
Couple operator*(const int &k,const Couple& c){
    Couple new_res(k*c.a,k*c.b);
    return new_res;
}

Couple Couple::operator*(const int& k){
    Couple new_res(k*this->a,k*this->b);
    return new_res;
}


Couple Couple::operator/(const int k)
{
    if(k==0){
        cout<<"Error can not divided by zero!"<<endl;
        return *this;//return *this is correct
    }
    Couple new_res(a/k,b/k);
    return new_res;
}
Couple Couple::operator+(const Couple& c){
    Couple new_res(this->a+c.a,this->b+c.b);
    return new_res;
}
Couple Couple::operator*(const Couple& c){
    Couple new_res(this->a*c.a,this->b*c.b);
    return new_res;
}
Couple Couple::operator-(const Couple& c){
    Couple new_res(this->a-c.a,this->b-c.b);
    return new_res;
}

int main()
{
    Couple a(3,4),b(1,2);
    Couple c=a+b;
    c.Show();//4,6
    Couple d=c/2;
    d.Show();//2,3
    Couple e=3*d;//如果不重载为类的友元函数,左操作数只能是Couple类的对象,那么这个计算无法进行,编译器会调用3.operator*(d),显然错误
    e.Show();//6,9
    Couple f=e*2;
    f.Show();//12,18
    //每次都会调用一次构造函数
    bool bo=(f==e);//False is 0
    bool bo2=(f==Couple(12,18));//True is 1
    cout<<bo<<" "<<bo2<<endl;
    return 0;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!