C++对运算符进行重载以有理数计算为例

这篇博客介绍了如何用 C++ 实现一个有理数类 Rational,包括构造函数、获取分子和分母、加减乘除运算、比较操作以及自增自减操作。此外,还提供了友元函数来实现输入输出流操作。通过这个类,可以方便地进行有理数的计算和比较。
摘要由CSDN通过智能技术生成
#ifndef Rational_hpp
#define Rational_hpp

#include <stdio.h>
#include <string>
#include <iostream>
using namespace::std;
class Rational{
public:
    Rational();
    Rational(int numerator,int denominator);
    int getNumerator()const;
    int getDemominator()const;
    Rational add(const Rational& secondRational);
    Rational sub(const Rational& secondRational);
    Rational mult(const Rational& secondRational);
    Rational div(const Rational& secondRational);
    int compareTo(const Rational& secondRational);
    bool equal(const Rational& secondRational);
    int intValue();
    double doubleValue();
    string toString();
    
    Rational(int numerator);
    //重载简写运算符
    Rational& operator+=(const Rational& secondRational);
    Rational& operator-=(const Rational& secondRational);
    Rational& operator*=(const Rational& secondRational);
    Rational& operator/=(const Rational& secondRational);
    //重载运算符[]
    int& operator[](int index);
    //重载自增自减运算符(前缀)
    Rational& operator++();
    Rational& operator--();
    //重载自增自减运算符(后缀)
    Rational operator++(int dummy);
    Rational operator--(int dummy);
    //重载'+','-'运算符(正负)
    Rational operator+();
    Rational operator-();
    //重载<<,>>运算符,使用友元类,
    friend ostream& operator<<(ostream& ,const Rational&);
    friend istream& operator>>(istream&, Rational&);
    
    
private:
    int numerator,denominator;
    static int gcd(int n,int d);
};
//重载非成员函数还例如>,<,<=,>=,==,!=号以及+,-,*,/
Rational operator+(Rational& r1,Rational& r2);
Rational operator-(Rational& r1,Rational& r2);
Rational operator*(Rational& r1,Rational& r2);
Rational operator/(Rational& r1,Rational& r2);

#endif /* Rational_hpp */
#include "Rational.hpp"
#include <cstdlib>
#include <sstream>
Rational::Rational(){
    numerator = 0;
    denominator = 1;
}
Rational::Rational(int numerator,int denominator){
    int factor = gcd(numerator, denominator);
    this->numerator = (numerator>0?1:-1) * abs(numerator)/factor;
    this->denominator = abs(denominator)/factor;
}
int Rational::gcd(int n, int d){
    int a = abs(n);
    int b = abs(d);
    int gcd = 1;
    for (int i=1; i<=a&&i<=b; i++) {
        if (a%i==0&&b%i==0) {
            gcd = i;
        }
    }
    return gcd;
}
Rational::Rational(int numerator){
    this->numerator = numerator;
    this->denominator = 1;
}
int Rational::getNumerator()const{
    return numerator;
}
int Rational::getDemominator()const{
    return denominator;
}
Rational Rational::add(const Rational &secondRational){
    int n;
    int d;
    n = numerator*secondRational.getDemominator()+denominator*secondRational.getNumerator();
    d=denominator*secondRational.getDemominator();
    return Rational(n,d);
}
Rational Rational::sub(const Rational &secondRational){
    int n;
    int d;
    n = numerator*secondRational.getDemominator()-denominator*secondRational.getNumerator();
    d=denominator*secondRational.getDemominator();
    return Rational(n,d);
}
Rational Rational::mult(const Rational &secondRational){
    int n,d;
    n = numerator*secondRational.getNumerator();
    d = denominator*secondRational.getDemominator();
    return Rational(n,d);
}
Rational Rational::div(const Rational &secondRational){
    int n,d;
    n = numerator*secondRational.getDemominator();
    d = denominator*secondRational.getNumerator();
    return Rational(n,d);
}
int Rational::compareTo(const Rational &secondRational){
    Rational temp =sub(secondRational);
    if (temp.getNumerator()<0) {
        return -1;
    }
    else if (temp.getNumerator()==0)
        return 0;
    else
        return 1;
}
bool Rational::equal(const Rational &secondRational){
    if (compareTo(secondRational)==0) {
        return true;
    }
    else
        return false;
}
int Rational::intValue(){
    return getNumerator()/getDemominator();
}
double Rational::doubleValue(){
    return 1.0*getNumerator()/getDemominator();
}
string Rational::toString(){
    stringstream ss;
    ss<<numerator;
    if (denominator>1) {
        ss<<"/"<<denominator;
    }
    return ss.str();
}

Rational& Rational::operator+=(const Rational& secondRational){
    *this = add(secondRational);
    return *this;
}
Rational& Rational::operator-=(const Rational &secondRational){
    *this = sub(secondRational);
    return *this;
}
Rational& Rational::operator*=(const Rational &secondRational){
    *this = mult(secondRational);
    return *this;
}
Rational& Rational::operator/=(const Rational &secondRational){
    *this = div(secondRational);
    return *this;
}

int& Rational::operator[](int index){
    if (index == 0) {
        return numerator;
    }
    else
        return denominator;
}
Rational& Rational::operator++(){
    numerator+=denominator;
    return *this;
}
Rational& Rational::operator--(){
    numerator-=denominator;
    return *this;
}
Rational Rational::operator++(int dummy){
    Rational temp(numerator,denominator);
    numerator+=denominator;
    return temp;
}
Rational Rational::operator--(int dummy){
    Rational temp(numerator,denominator);
    numerator-=denominator;
    return temp;
}
Rational Rational::operator+(){
    return *this;
}
Rational Rational::operator-(){
    return Rational(-numerator,denominator);
}
ostream& operator<<(ostream& out,const Rational& firstRational){
    if (firstRational.denominator==1) {
        out<< firstRational.numerator;
    }
    else
        out<<firstRational.numerator<<"/"<<firstRational.denominator;
    return out;
}
istream& operator>>(istream& in,Rational& firstRational){
    cout<<"请输入分子:";
    in>>firstRational.numerator;
    cout<<"请输入分母";
    in>>firstRational.denominator;
    return in;
}
Rational operator+(Rational& r1,Rational& r2){
    return r1.add(r2);
}
Rational operator-(Rational& r1,Rational& r2){
    return r1.sub(r2);
}
Rational operator*(Rational& r1,Rational& r2){
    return r1.mult(r2);
}
Rational operator/(Rational& r1,Rational& r2){
    return r1.div(r2);
}

测试

#include <iostream>
#include "Rational.hpp"
using namespace::std;
int main(int argc, const char * argv[]) {
    Rational a(3,4);
    Rational b(5,2);
    Rational c(1,2);
    cout<<a<<" + "<<b<<"="<<a+b<<endl;
    cout<<a<<" - "<<b<<"="<<a-b<<endl;
    cout<<a<<" * "<<b<<"="<<a*b<<endl;
    cout<<a<<" / "<<b<<"="<<a/b<<endl;
    
    a[0] = 2;
    cout<<a<<"\n"<<a.doubleValue()<<endl;
    cout<<a<<"++为"<<++a<<endl;
    b += c;
    cout<<b<<" "<<c<<endl;
    
    Rational d;
    cin>>d;
    cout<<d<<endl;
    return 0;
}

结果

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值