C++重载运算符实现分数加减乘除

本文实例为大家分享了C++重载运算符实现分数加减乘除的具体代码,供大家参考,具体内容如下

实现结果如下图所示:

代码如下所示:

#include <iostream>

using namespace std;

class Rational {
public:
 Rational operator+(Rational rhs);
 Rational operator-(Rational rhs);
 Rational operator*(Rational rhs);
 Rational operator/(Rational rhs);
 Rational(int num, int denom);

private:
 void normalize(); //负责对分数做化简工作

 int numerator;//分子
 int denominator;//分母

 friend std::ostream& operator<<(ostream& os, Rational f);
};

Rational::Rational(int num, int denom) {
 numerator = num;
 denominator = denom;

 normalize();
}

//只允许分子为负数,若分母为负数则把负数挪到分子部分
//利用欧几里得算法将分数简化
void Rational::normalize() {
 if (denominator < 0) {
  numerator = -numerator;
  denominator = -denominator;
 }

 //欧几里得算法
 int a = abs(numerator);
 int b = abs(denominator);

 //求出最大公约数,a
 //eg: a=12,b=9.
 //t=3 a=9 b=3
 //t=0 a=3 b=0
 while (b > 0) {
  int t = a % b;//t为余数
  a = b; //a取除数
  b = t; //b取余数
 }

 //分子、分母分别处以最大公约数
 numerator /= a;
 denominator /= a;
}

//重载运算符函数是类的成员函数
//分数是先通分再加减
// a*d+b*c / b*d
Rational Rational::operator+(Rational rhs) {
 int a = numerator;
 int b = denominator;
 int c = rhs.numerator;
 int d = rhs.denominator;

 return Rational(a*d+b*c,b*d);
}
Rational Rational::operator-(Rational rhs) {
 int a = numerator;
 int b = denominator;
 int c = rhs.numerator;
 int d = rhs.denominator;

 return Rational(a*d - b*c, b*d);

 /*
 **这里有个偷懒的写法
 rhs.numerator = -rhs.numerator;
 return operator+(rhs);
 */
}
Rational Rational::operator*(Rational rhs) {
 int a = numerator;
 int b = denominator;
 int c = rhs.numerator;
 int d = rhs.denominator;

 return Rational(a*c, b*d);
}
Rational Rational::operator/(Rational rhs) {
 int t = rhs.denominator;
 rhs.denominator = rhs.numerator;
 rhs.numerator = t;

 return operator*(rhs);
}
//该函数是友元函数,因此不用加空间域名
ostream& operator<<(ostream& os, Rational f);

int main() {
 Rational r1(4, 18);
 Rational r2(14, 18);

 cout << r1 << " + " << r2 << " = " << (r1 + r2) << endl;
 cout << r1 << " - " << r2 << " = " << (r1 - r2) << endl;
 cout << r1 << " * " << r2 << " = " << (r1 * r2) << endl;
 cout << r1 << " / " << r2 << " = " << (r1 / r2) << endl;

 system("pause");
 return 0;
}

ostream& operator<<(ostream& os, Rational f) {
 os << f.numerator << "/" << f.denominator;
 return os;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++ 中重载和运算符重载加号实现矩阵相加实例代码

     C++ 重载+运算符重载加号 实现矩阵相加 学习C++ 基础知识,这里实现简单的实例,记录下自己学习生活,很简单,大家一起看看吧! 实例代码: #include<iostream> #include<iomanip> using namespace std; class Complex { private: int i,j,n,a[2][3]; public: Complex(); Complex operator+(Complex &c); void display()

  • 详解C++语言中的加法运算符与赋值运算符的用法

    加法运算符:+ 和 - 语法 expression + expression expression – expression 备注 相加运算符为: 加 (+) 减 (–) 这些二进制运算符具有从左至右的关联性. 相加运算符采用算术或指针类型的操作数.加法 (+) 运算符的结果是操作数之和.减法 (–) 运算符的结果是操作数之差.如果一个操作数是指针或两个操作数都是指针,则它们必须是指向对象的指针,而不是指向函数的指针.如果两个操作数都是指针,则结果没有意义,除非它们是指向同一数组中的对象的指针.

  • C++重载运算符实现分数加减乘除

    本文实例为大家分享了C++重载运算符实现分数加减乘除的具体代码,供大家参考,具体内容如下 实现结果如下图所示: 代码如下所示: #include <iostream> using namespace std; class Rational { public: Rational operator+(Rational rhs); Rational operator-(Rational rhs); Rational operator*(Rational rhs); Rational operator

  • Python正确重载运算符的方法示例详解

    前言 说到运算符重载相信大家都不陌生,运算符重载的作用是让用户定义的对象使用中缀运算符(如 + 和 |)或一元运算符(如 - 和 ~).说得宽泛一些,在 Python 中,函数调用(()).属性访问(.)和元素访问 / 切片([])也是运算符. 我们为 Vector 类简略实现了几个运算符.__add__ 和 __mul__ 方法是为了展示如何使用特殊方法重载运算符,不过有些小问题被我们忽视了.此外,我们定义的Vector2d.__eq__ 方法认为 Vector(3, 4) == [3, 4]

  • C++重载运算符的规则详解

    (1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载.例如,有人觉得BASIC中用"* *"作为幂运算符很方便,也想在C++中将"* *"定义为幂运算符,用"3* *5"表示35,这是不行的. (2)C++允许重载的运算符C++中绝大部分运算符都是可以被重载的. 不能重载的运算符只有5个: .             (成员访问运算符) .*            (成员指针访问运算符) ::             (域运

  • C#重载运算符详解

    本文较为详细的描述了重载运算符的方法.一般来说,重载运算符在实际的项目开发中会经常的用到,但如果某些自定义类型通过简短几行代码重载一些常用的运算符(如:+-*/),就能让编程工作带来方便:重载运算符就是告诉编译器+-*/等运算符对于自定义类型进行什么样的操作,在代码中需要注意几点. 一.尽可能的不要改变运算符本身的含义 二.所有的运算符重载都必须声明为public和static 三.不同于扩展方法,所重载的方法必须是在被重载的类型内部,且用关键字operator C#中的两个字符串相加,实际上是

  • 详解C++ 重载运算符和重载函数

    C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同. 当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义.选择最合适的重载函数或重载运算符的过程,称为重载决策. C++ 中的函数重载 在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数.类型或

  • python接口,继承,重载运算符详解

    目录 1. 序列__getitem__ 2. __setitem__ 3. 抽象基类 4. 不要直接子类化内置类型 5. 继承顺序 6. 重载运算符 总结 1. 序列__getitem__ 如果没有 __iter__ 和 __contains__ 方法, Python 会调用 __getitem__ 方法, 设法让 迭代 和 in 运算符可用 class Foo: def __getitem__(self, pos): return range(0, 30, 10)[pos] f = Foo()

  • C++重载运算符你真的了解吗

    目录 1.重载运算符的必要性 2.重载运算符的形式与规则 3.重载运算符的运算 4.转义运算符 总结 运算符实际上是一个函数,所以运算符的重载实际上是函数的重载,.编译程序对运算符的重载的选择,遵循函数重载的选择原则.当遇到不很明显的运算时,编译程序会寻找与参数相匹配的运算符函数. 1.重载运算符的必要性 C++语言中的数据类型分为基本数据类型和构造数据类型.基本数据类型可以直接完成算术运算.例如: #include<bits/stdc++.h> using namespace std; in

  • C++实践分数类中运算符重载的方法参考

    [项目-分数类中的运算符重载] (1)实现分数类中的运算符重载,在分数类中可以完成分数的加减乘除(运算后再化简).比较(6种关系)的运算. class CFraction { private: int nume; // 分子 int deno; // 分母 public: //构造函数及运算符重载的函数声明 }; //重载函数的实现及用于测试的main()函数 (2)在(1)的基础上,实现分数类中的对象和整型数的四则运算.分数类中的对象可以和整型数进行四则运算,且运算符合交换律.例如:CFrac

  • C++中运算符重载详解及其作用介绍

    目录 概述 函数重载 运算符重载 C++ 的运算符 重载运算符的规则 成员函数实现 Complex 加法 运算符重载的方法 多种实现方法 实现 operator+= 三种运算符重载函数 成员函数实现 友元函数实现 输出结果 重载单元运算符 例子 重载二元运算符 例子 重载 I/O 插入运算符 << 提取运算符 >> 总结 概述 运算符重载 (Operator Overloading) 函数重载 重载: 将同一名字重新赋予新的含义. 函数重载: 对一个函数赋予新的含义, 使之实现新功

  • C++简单又好用的基本运算符重载

    目录 运算符重载概念 加号运算符重载 成员函数实现 全局函数实现 运算符实现函数重载 总结 运算符重载概念 对已有的运算符进行重新定义,赋予其另外一种功能,以适应不同的数据类型 我们知道已有的运算符有'+'.'-'.'*'.'/'等,这些运算符对于内置数据类型可以直接使用,例如int.float.double.char等等.但是如果我们定义一个类,想实现类中对象属性的加减乘除运算,该怎么实现呢?那就用到运算符重载的知识点了. 加号运算符重载 学会一个顶四个,这篇博文只举例加号运算符重载 成员函数

随机推荐