[C++]分?jǐn)?shù)類的定義(成員函數(shù)、運算符重載)
[C++]分?jǐn)?shù)類的定義(成員函數(shù)、運算符重載)
1 分?jǐn)?shù)類成員和成員函數(shù)
1.1 分?jǐn)?shù)類成員
對于分?jǐn)?shù)類,可以將分?jǐn)?shù)拆分為分子和分母兩個整型數(shù)據(jù)進行存儲,所以分?jǐn)?shù)類的成員只有兩個,一個是分子(numerator),一個是分母(denominator)。
1.2 分?jǐn)?shù)類的成員函數(shù)
C++將關(guān)于類的操作以成員函數(shù)的形式在類定義中實現(xiàn),針對分?jǐn)?shù)的四則運算和關(guān)系運算,我們需要通過代碼在分?jǐn)?shù)類中逐一實現(xiàn)四則運算和關(guān)系運算對應(yīng)的功能。
而+、-、*、/、>、<、==等符號已經(jīng)有了定義,且不能對分?jǐn)?shù)類進行操作。所以這些運算符需要通過運算符重載來實現(xiàn)。
除此之外,還有分?jǐn)?shù)常涉及的約分運算,也需要實現(xiàn)。
1.3 分?jǐn)?shù)類的io操作
對于int、double、char等數(shù)據(jù)類型的io操作已經(jīng)在iostream中定義,所以通常會用
int x;
cin>>x;
cout<<"hello world!"<<endl;
這樣的代碼來執(zhí)行輸入和輸出。為了能使分?jǐn)?shù)類的輸入和輸出也能簡單地完成,還需要重載">>“和”<<"符號。
1.4 分?jǐn)?shù)類的預(yù)定義
// Fraction.cpp
#include <iostream>
#include <iomanip>
using namespace std;
// 分?jǐn)?shù)類
class Fraction
{
public:
//構(gòu)造函數(shù),初始化用
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);
//加減乘除,結(jié)果需要化簡
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);
//關(guān)系運算符
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+();//重載運算符,實現(xiàn)將分?jǐn)?shù)變?yōu)檎?/span>
Fraction operator-();//重載運算符,實現(xiàn)取將分?jǐn)?shù)變?yōu)樨?fù)
void setNumerator(int nume);//設(shè)置分子的值
int getNumerator() const;//獲取分子
void setDenominator(int denom);//設(shè)置分母的值
int getDenominator() const;//獲取分母
private://成員
int numerator; // 分子
int denominator; // 分母
};
2 成員函數(shù)定義
2.1 化簡
void Fraction::simplify() //約分
{
int nume, deno;
if (this->numerator == 0)//分子為0的情況
this->denominator = 1;
else if (this->numerator * this->denominator > 0)//分子分母同號,即分?jǐn)?shù)為正的情況
{
if (this->numerator < 0)//如果分子分母都為負(fù),則消掉負(fù)號
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//分?jǐn)?shù)為負(fù)時
{
nume = abs(this->numerator), deno = abs(this->denominator);//先取分子分母的絕對值進行化簡操作,再添加負(fù)號,完成對負(fù)分?jǐn)?shù)的化簡操作
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 關(guān)系運算符的重載(以>為例)
bool operator>(const Fraction &leftFraction, const Fraction &rightFraction)
{
if ((float)leftFraction.numerator / (float)leftFraction.denominator > (float)rightFraction.numerator / (float)rightFraction.denominator)//化為小數(shù)進行比較
return true;
else
return false;
}
2.4 輸入輸出的重載(以<<為例)
ostream &operator<<(ostream &out, const Fraction &fraction) //重載輸出流
{
return out << fraction.numerator << "/" << fraction.denominator;
}
完整代碼存放在gitee
浙公網(wǎng)安備 33010602011771號