天天看点

c++流符号重载例子

#include<iostream>

#include<string>

//分数的加减乘除

//重载元素符+ -  * /

class Yls{

public:

    Yls(){

        fenzi=0;

        fenmu=0;

    };

    Yls(int a,int b){

        fenzi=a;

        fenmu=b;

    };

    Yls operator+(Yls &point){

        Yls yls;

        yls.fenzi=fenzi+point.fenzi;

        yls.fenmu=fenmu;

        yls.normalize();

        return yls;

    }

    Yls operator-(Yls &point2){

        Yls yls2;

        yls2.fenzi=fenzi-point2.fenzi;

        yls2.fenmu=fenmu;

        yls2.normalize();

        return yls2;

    }

    Yls operator*(Yls &point){

        Yls yls;

        yls.fenzi=fenzi*point.fenzi;

        yls.fenmu=fenmu*point.fenmu;

        yls.normalize();

        return yls;

    }

    Yls operator/(Yls &point){

        Yls yls;

        yls.fenzi=fenzi*point.fenmu;

        yls.fenmu=fenmu*point.fenzi;

        yls.normalize();

        return yls;

    }

    int first(){

        return fenzi;

    }

    int second(){

        return fenmu;

    }

private:

    void normalize(){

        if(fenmu<0){

            fenzi*=-1;

            fenmu*=-1;

        }

        int a=abs(fenzi),b=abs(fenmu),t;

        while(b>0){

            t=a%b;

            a=b;

            b=t;

        }

        fenzi/=a;

        fenmu/=a;

    };

    int fenzi;

    int fenmu;

//声明为友元函数,依次将yls类型的分子分母输到流里,返回值一般是流对象

    friend std::ostream& operator<< (std::ostream& os,Yls yls){

        os<<yls.fenzi<<"/"<<yls.fenmu;

        return os;

    };

};

int main()

{

    Yls ya(1,8);

    Yls yb(9,8);

    Yls yc;

    yc=ya+yb;

//未用重载后的<<

    std::cout<<"ya="<<ya.first()<<"/"<<ya.second()<<"  yb="<<yb.first()<<"/"<<yb.second()<<"\n";

    std::cout<<"ya+yb=";

    std::cout<<yc.first()<<"/"<<yc.second()<<"\n";

    std::cout<<"ya-yb=";

    std::cout<<(ya-yb).first()<<"/"<<(ya-yb).second()<<"\n";

    yc=ya*yb;

    std::cout<<"ya*yb=";

    std::cout<<yc.first()<<"/"<<yc.second()<<"\n";

    yc=ya/yb;

    std::cout<<"ya/yb=";

    std::cout<<yc.first()<<"/"<<yc.second()<<"\n";

    //用重载后的<<可以轻松输出yls(有理数)为a/b(分数)形式

    std::cout<<ya<<"\t"<<yb<<"\t"<<yc;

    return 0;

}

继续阅读