[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 分数类的预定义

// Fraction.cpp
#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;elsenume = 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)/acsum.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;elsereturn false;
}

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

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

完整代码存放在gitee

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

  1. C++类的成员函数(在类外定义成员函数、inline成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  2. C++类的成员函数(在类外定义成员函数)

    类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它也有返回值和函数类型,它与一般函数的区别只是:它是属于一个类的成员,出现在类体中.它可以被指定为private ...

  3. C++的成员函数声明与定义 —— 类外定义成员函数以及inline函数

    作者原文:https://www.cnblogs.com/wuchanming/p/4061654.html 类的成员函数(简称类函数)是函数的一种,它的用法和作用和前面介绍过的函数基本上是一样的,它 ...

  4. 在类内定义成员函数、在类外定义成员函数、计算长方体的体积【C++面向对象编程类的使用经典案例】

    文章目录 一.在类内定义成员函数 二.在类外定义成员函数(使用符号::) 三.计算3个长方体的体积(class成员函数) 一.在类内定义成员函数 #include <iostream> u ...

  5. C++ Primer 第五版 第7章类 7.1——类讲解(成员函数、非成员函数、构造函数)

    习题答案请参考:C++ Primer 第五版 第7章类 7.1--类讲解(成员函数.非成员函数.构造函数)习题答案 目录 7.1 类讲解(成员函数.非成员函数.构造函数) 成员函数 this cons ...

  6. C++类和对象成员函数,静态成员,构造函数和析构函数、初始化列表

    类和对象 数据成员的访问 定义成员函数 调用成员函数 私有成员函数 构造函数和析构函数 构造函数成员初始化列表 在构造函数中使用new的注意事项 this指针 const成员函数 运算符重载 友元函数 ...

  7. C++中模板类中的成员函数以及模板函数在类外定义

    在C++中,类中的成员函数可以在类外完成定义,从而显得类中的成员函数看起来简洁明了.但是模板类里的成员函数和模板函数与普通的成员函数在类外定义不同. 先定义一个模板类以及成员函数和模板函数: 接下我们 ...

  8. C++——运算符的重载---以成员函数方式重载---以友元函数方式重载

    一.运算符的重载 1.运算符的重载 允许把标准运算符(如+ - * /等运算符)应用于自定义数据类型的对象,可以提高程序的可读性,运算符的重载本质上还是函数重载.运算符仅仅是语法上的方便,它是另一种函 ...

  9. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性

    本文包含以下内容 1. C++的四类特殊成员函数介绍,重点介绍拷贝构造函数和拷贝复制运算符 2. C++11中的default/delete特性 本文内容侧重个人理解,深入理解其原理推荐https:/ ...

最新文章

  1. linux nfs共享文件
  2. JavaScript 函数 伪数组 arguments
  3. ccf报数游戏java_ccf 201712 02 (游戏)
  4. mysql学时用什么类型_MYSQL数据库学习----MYSQL数据类型
  5. MySQL多对多创建表语句(防忘记)
  6. 微信开放平台 公众号第三方平台开发 教程五 代公众号发起网页授权源码
  7. wpd小波包分解_基于奇异值分解和小波包分解的故障检测
  8. word文档如何画线条流程图_Word中流程图如何画 手把手教你制作!
  9. 想转行学IT,Java怎么样?
  10. 我的团长我的团——真正的中国军人
  11. Qt使用QChart制作多路虚拟示波器
  12. “我,从油漆工开始的80后,曾经靠副业的收入买车买房”
  13. 女子花2万元雇友人杀逝世女街坊
  14. IT外企那点儿事(13): 你总是在画饼吗?
  15. 行为型模式-观察者模式
  16. cmd命令行下常见的注册表操作
  17. Vue 自定义音乐播放器组件为H5添加背景音乐
  18. 计算机三级网络技术第三章(第一轮)
  19. linux下easy_install的安装与使用详解
  20. 【无标题】把js脚本藏在书签里 一键运行代码

热门文章

  1. 安卓手机如何下载ZOOM?
  2. CSS浮动、定位及显示隐藏元素
  3. 新浪期货接口_金融期货字段解释
  4. H.264 片段头(SliceHead)
  5. [案例5-1]模拟订单号生成
  6. CorelDRAW2020工作室版下载及新增功能介绍
  7. 欧拉路径和欧拉回路(Euler Path and Euler Circuit)解释
  8. 阿里巴巴Android开发规范
  9. linux系统启动卡住不动了,Linux不讲武德——卡在开机界面就不动了
  10. Dubbo调用常见错误disabled, not registered or in blacklist