• fraction类的运算重载


    重载>> 和  <<

    #include <iosfwd> // 或 #include <iostream>
    using std::istream;
    using std::ostream;
    
    friend istream& operator>> (istream& , Myclass& );
    friend ostream& operator<< (ostream& , const Myclass& );

    运算符重载举例

    //fraction.h
    #ifndef FRACTION_H
    #define FRACTION_H
    
    #include <iostream>
    
    class Fraction
    {
        friend std::ostream& operator<< (std::ostream& out, const Fraction& f);
        public:
            Fraction(long n=0, long d=1);
            virtual ~Fraction();
            Fraction operator- () const//重载负号(一元运算符重载)
            {
                return Fraction(-num, den);
            }
            Fraction operator+ (const Fraction& f) const //重载加号(二元运算符重载)
            {
                return Fraction(num*f.den + den*f.num, den*f.den);
            }
            Fraction operator++ () //重载 前缀“++”
            {
                num += den;
                return *this;
            }
            Fraction operator++ (int)//重载 后缀++,int是一个虚拟参数
            {
                Fraction f(*this);
                num+= den;
                return f;
            }
    
            //重载类型转换符
            //1.必须重载为成员函数
            //2.不需要返回类型,因为运算符本身就是返回的类型
            operator long() const
            {
                return num/den;
            }
    
            //重载赋值运算符“=”,只能重载为成员函数。
            //若不写,系统提供默认赋值(按位赋值)
            //注意:返回类的引用
            //一般顺序:1.判断是否是同一对象
            //          2.若被赋值的对象占用了动态空间,应先释放。再申请空间赋值
            //          3.返回 return *this;
            /*
                String& operator= (const String& s)
                {
                    if(&s == this) return *this;
                    if(pChar) delete[] pChar;
                    if(s.pChar == NULL) p = NULL;
                    else
                    {
                        pChar = new char[strlen(s.pChar)+1];
                        strcpy(pChar, s.pChar);
                    }
                    return *this;
                }
            */
            Fraction& operator= (const Fraction& f)//只能重载为成员函数。
            {
                if(&f == this) return *this;
                num = f.num;
                den = f.den;
                return *this;
            }
    
            Fraction& operator+= (const Fraction& f)
            {
                *this = *this + f;
                return *this;
            }
    
            bool operator> (const Fraction& f)const
            {
                return num*f.den > den*f.num;
            }
    
    
        protected:
            void standardize();//标准化
            /*
            标准分数:1. 分母永远为正,分数的符号由分子表示
                      2. 分子分母互为质数,即最简分数
            */
    
        private:
            long num;//分子
            long den;//分母
    
    };
    
    #endif // FRACTION_H
    

      

    //fraction.cpp
    #include "fraction.h"
    #include <cmath>
    
    std::ostream& operator<< (std::ostream& out, const Fraction& f)
    {
        if(f.num == 0)
            out << "0";
        else if(1 == f.den) out << f.num;
        else
            out << f.num << "/" << f.den;
        return out;
    }
    
    static long gcd(long m, long n)
    {//求最大公约数
        int r = 0;
        while(n)
        {
            r = m % n;
            m = n;
            n = r;
        }
        return fabs(m);
    }
    void Fraction::standardize()
    {
        if(0L == num || 0L == den)
        {
            num = 0L;
            den = 1L;
            return;
        }
        if(den < 0L)
        {//分数的符号让分子表示
            num = -num;
            den = -den;
        }
        long g = gcd(num,den);
        num /= g;
        den /= g;
    }
    
    Fraction::Fraction(long n, long d):num(n),den(d)
    {
        standardize();
    }
    
    Fraction::~Fraction()
    {
        //dtor
    }
    

      

    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    [2020BUAA软工助教]助教每周小结(week 9)
    关于强制转会的说明
    Windows更新崩溃记~
    WPF 在DataTemplate定义事件触发器不生效的问题
    Github上不去方法
    TCPListener.AcceptTcpClient阻塞进程退出方法
    Lamada 借助All实现ForEach
    WPF 关于在ContextMenu中绑定带参数的命令
    关于WPF.ICommand.CanExcute
    .NET程序员疫情之下找工作现状
  • 原文地址:https://www.cnblogs.com/htj10/p/10689595.html
Copyright © 2020-2023  润新知