zoukankan      html  css  js  c++  java
  • 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
    }
    

      

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

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    155. 最小栈
    160. 相交链表
    PAT 1057 Stack
    PAT 1026 Table Tennis
    PAT 1017 Queueing at Bank
    PAT 1014 Waiting in Line
    PAT 1029 Median
    PAT 1016 Phone Bills
    PAT 1010 Radix
    PAT 1122 Hamiltonian Cycle
  • 原文地址:https://www.cnblogs.com/htj10/p/10689595.html
Copyright © 2011-2022 走看看