[C++]分数类的定义(成员函数、运算符重载)

时间:2025-03-27 07:18:16

[C++]分数类的定义(成员函数、运算符重载)

  • 1 分数类成员和成员函数
    • 1.1 分数类成员
    • 1.2 分数类的成员函数
    • 1.3 分数类的io操作
    • 1.4 分数类的预定义
  • 2 成员函数定义
    • 2.1 化简
    • 2.2 四则运算符的重载(以+为例)
    • 2.3 关系运算符的重载(以>为例)
    • 2.4 输入输出的重载(以

1 分数类成员和成员函数

1.1 分数类成员

对于分数类,可以将分数拆分为分子和分母两个整型数据进行存储,所以分数类的成员只有两个,一个是分子(numerator),一个是分母(denominator)

1.2 分数类的成员函数

C++将关于类的操作以成员函数的形式在类定义中实现,针对分数的四则运算和关系运算,我们需要通过代码在分数类中逐一实现四则运算和关系运算对应的功能。

而+、-、*、/、>、<、==等符号已经有了定义,且不能对分数类进行操作。所以这些运算符需要通过运算符重载来实现。

除此之外,还有分数常涉及的约分运算,也需要实现。

1.3 分数类的io操作

对于int、double、char等数据类型的io操作已经在iostream中定义,所以通常会用

int x;
cin>>x;
cout<<"hello world!"<<endl;

这样的代码来执行输入和输出。为了能使分数类的输入和输出也能简单地完成,还需要重载">>“和”<<"符号。

1.4 分数类的预定义

// 
#include <iostream>
#include <iomanip>
using namespace std;

// 分数类
class Fraction
{
public:
	//构造函数,初始化用
	Fraction(int nume = 0, int denom = 1)
		: numerator(nume), denominator(denom) {}

	//化简(使分子分母没有公因子)
	void simplify();

	//输入输出重载
	friend ostream &operator<<(ostream &out, const Fraction &fraction);
	friend istream &operator>>(istream &in, Fraction &fraction);
	
	//加减乘除,结果需要化简
	friend Fraction operator+(const Fraction &leftFraction, const Fraction &rightFraction);
	friend Fraction operator-(const Fraction &leftFraction, const Fraction &rightFraction);
	friend Fraction operator*(const Fraction &leftFraction, const Fraction &rightFraction);
	friend Fraction operator/(const Fraction &leftFraction, const Fraction &rightFraction);

	//关系运算符
	friend bool operator>(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator<(const Fraction &leftFraction, const Fraction &rightFraction);	
	friend bool operator>=(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator<=(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator==(const Fraction &leftFraction, const Fraction &rightFraction);
	friend bool operator!=(const Fraction &leftFraction, const Fraction &rightFraction);
	//取+、-一目运算符
	Fraction operator+();//重载运算符,实现将分数变为正
	Fraction operator-();//重载运算符,实现取将分数变为负

	void setNumerator(int nume);//设置分子的值
	int getNumerator() const;//获取分子

	void setDenominator(int denom);//设置分母的值
	int getDenominator() const;//获取分母

private://成员
	int numerator;	 // 分子
	int denominator; // 分母
};

2 成员函数定义

2.1 化简

void Fraction::simplify() //约分
{
	int nume, deno;
	if (this->numerator == 0)//分子为0的情况
		this->denominator = 1;
	else if (this->numerator * this->denominator > 0)//分子分母同号,即分数为正的情况
	{
		if (this->numerator < 0)//如果分子分母都为负,则消掉负号
			nume = -this->numerator, deno = -this->denominator;
		else
			nume = this->numerator, deno = this->denominator;
		for (int i = (nume < deno ? nume : deno); i >= 1; i--)//化简
		{
			if (nume % i == 0 && deno % i == 0)
				nume /= i, deno /= i;
		}
		this->numerator = nume, this->denominator = deno;
	}
	else//分数为负时
	{
		nume = abs(this->numerator), deno = abs(this->denominator);//先取分子分母的绝对值进行化简操作,再添加负号,完成对负分数的化简操作
		for (int i = (nume < deno ? nume : deno); i >= 1; i--)
		{
			if (nume % i == 0 && deno % i == 0)
			{
				nume /= i;
				deno /= i;
			}
		}
		this->numerator = -nume, this->denominator = deno;
	}
}

2.2 四则运算符的重载(以+为例)

Fraction operator+(const Fraction &leftFraction, const Fraction &rightFraction) //重载运算符+
{
	Fraction sum(leftFraction.numerator * rightFraction.denominator + rightFraction.numerator * leftFraction.denominator, leftFraction.denominator * rightFraction.denominator);//b/a+d/c=(bc+ad)/ac
	sum.simplify();
	return sum;
}

2.3 关系运算符的重载(以>为例)

bool operator>(const Fraction &leftFraction, const Fraction &rightFraction)
{
	if ((float)leftFraction.numerator / (float)leftFraction.denominator > (float)rightFraction.numerator / (float)rightFraction.denominator)//化为小数进行比较
		return true;
	else
		return false;
}

2.4 输入输出的重载(以<<为例)

ostream &operator<<(ostream &out, const Fraction &fraction) //重载输出流
{
	return out << fraction.numerator << "/" << fraction.denominator;
}

完整代码存放在gitee