天天看點

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;

}

繼續閱讀