要求:
1.建立一个分数类。分数类的成员包括分子和分母,操作包括约分、通分、加、减、乘、除、复制赋值、求倒数、比较、显示、输入;
2.加(+)、减(-)、乘(*)、除(/)、比较(>, >=, <, <=)、复制赋值(=)的操作采用运算符重载的方式实现;
3.功能要求:能够处理int,double,float型数据与分数类对象的混合运算;
4.测试用例涵盖所有功能(包括分数类之间的运算以及分数类与int,double,float型数据的运算),需包含运行结果图、测试目的说明、运行结果分析;
5.代码整洁、规范
6.附运行结果图,并对测试用例、测试目的、运行结果进行说明与分析
一些相关问题:
1.简述成员函数与友元函数的区别,并分析哪些功能需要用成员函数实现,哪些功能需要用友元函数实现;
①成员函数是类定义的一部分,通过特定的对象来调用。成员函数可以隐式访问调用对象的成员,而无须使用成员操作符。友元函数不是类的组成部分,因此被称为直接函数调用。友元函数不能隐式访问类成员,而必须将成员操作符用于作为参数传递的对象。作为类的非成员函数,而且当要访问的数据为对象的私有成员函数时,则必须声明为类的友元函数。
②当运算符重载函数作为类的成员函数时,要求操作数左边必须是一个对象,而函数的参数可以是同类的对象也可以是普通的变量。
③因为默认的复制赋值运算符是成员函数,友元函数不能取代成员函数,因此复制复制运算符(=)重载也必须为成员函数。而分数类的四则运算,以及比较运算既可以使用成员函数也可以使用友元函数,但涉及到分数类对象与不同数据类型的运算时,必须使用友元函数。
2.简述传值与引用的区别,并分析不同函数所需采用的参数传递方式,并简述原因;
①传值调用传递的是变量的拷贝,而后两种调用传递的则是变量本身,因此传值调用中改变的仅是变量的拷贝,而不是变量本身,相反,当需要改变变量本身的时候就可以用后两种调用。
②当传递的变量很大时,传值调用的结果就是效率低下,因为会经过一个型参到实参的拷贝过程,而后两种调用由于传递的就是变量本身,因此效率会高些。
③传引用调用和传指针调用的区别是引用参数必须指向一个对象,而且在函数中不能改变所指,相反,传指针调用则不存在这个问题,指针开始可以是一个什么都不指向的空指针,而且在函数中可以指向不同的对象。
④对分数类的四则运算及比较运算均为引用的方式不需要创建临时变量,可以提高效率;而复制赋值运算时是传值的形式,不影响实参;
C++代码:

#include<iostream>
#include<cmath>
using namespace std;class Fraction
{double nume;   //分子double deno;   //分母
public:Fraction(double nume = 0, double deno = 1);    //默认参数void reduction();                           //约分void tongfen(Fraction& , Fraction& );     //通分void display();                 //显示分数void input();                   //输入分数//重载四则运算符friend Fraction operator +(Fraction& , Fraction&);  //加法friend Fraction operator -(Fraction& , Fraction&);  //减法friend Fraction operator *(Fraction& , Fraction&);  //乘法friend Fraction operator /(Fraction& , Fraction&);  //除法Fraction operator =(Fraction);        //复制赋值//重载比较操作符friend bool operator > (Fraction&, Fraction&);    //大于friend bool operator >=(Fraction&, Fraction&);   //大于等于friend bool operator < (Fraction&, Fraction&);    //小于friend bool operator <=(Fraction&, Fraction&);   //小于等于
};
Fraction::Fraction(double nu, double de)
{nume = nu;deno = de;
}
//输入
void Fraction::input()
{char ch;cin >> nume >> ch >> deno;while (deno == 0){cout << "分母不能为0,请重新输入:" << endl;cin >> nume >> ch >> deno;}nume *= 1000; //处理小数,只能精确到后三位deno *= 1000;
}
//显示
void Fraction::display()
{reduction();if (nume == 0)cout << '0' << endl;else if (deno == 1)cout << nume << endl;elsecout << nume << '/' << deno << endl;
}
//约分
void Fraction::reduction()
{int m, n, r;n = fabs(deno);m = fabs(nume);r = m % n;while (r)  // 求m,n的最大公约数{m = n;n = r;r = m % n;}deno /= n;     // 化简nume /= n;if (deno < 0)  // 将分母转化为正数{deno = -deno;nume = -nume;}
}
//通分
void Fraction::tongfen(Fraction& x,Fraction& y)
{x.deno = (x.deno * y.deno);x.nume = (x.nume * y.deno);reduction();cout << x.nume << '/' << x.deno << endl;
}// 分数复制赋值
Fraction Fraction:: operator=(Fraction f)
{Fraction temp;temp.nume = f.nume;temp.deno = f.deno;nume = temp.nume;deno = temp.deno;return temp;
}
//加法
Fraction operator+(Fraction& x, Fraction& y)
{Fraction temp;temp.nume = x.nume * y.deno + x.deno * y.nume;temp.deno = x.deno * y.deno;return temp;
}
//减法
Fraction operator-(Fraction& x, Fraction& y)
{Fraction temp;temp.nume = x.nume * y.deno - x.deno * y.nume;temp.deno = x.deno * y.deno;return temp;
}
//乘法
Fraction operator*(Fraction& x, Fraction& y)
{Fraction temp;temp.nume = x.nume * y.nume;temp.deno = x.deno * y.deno;return temp;
}
//除法
Fraction operator/(Fraction& x, Fraction& y)
{Fraction temp;temp.nume = x.nume * y.deno;temp.deno = x.deno * y.nume;return temp;
}
//大于
bool operator >(Fraction& x, Fraction& y)
{if (x.nume * y.deno - x.deno * y.nume > 0)return true;elsereturn false;
}
//大于等于
bool operator >=(Fraction& x, Fraction& y)
{if (x.nume * y.deno - x.deno * y.nume >= 0)return true;elsereturn false;
}
//小于
bool operator <(Fraction& x, Fraction& y)
{if (x.nume * y.deno - x.deno * y.nume < 0)return true;elsereturn false;
}
//小于等于
bool operator <=(Fraction& x, Fraction& y)
{if (x.nume * y.deno - x.deno * y.nume <= 0)return true;elsereturn false;
}
//主函数
int main() {Fraction x, y, s;cout << "请输入x:" << endl;x.input();cout << "请输入y:" << endl;y.input();s = x + y;cout << "x+y="; s.reduction(); s.display();s = x - y;cout << "x-y="; s.display();s = x * y;cout << "x*y="; s.display();s = x / y;cout << "x/y="; s.display();s = x > y;cout << "x>y的结果true为1,false为0:"; s.display();s = x >= y;cout << "x>=y的结果true为1,false为0:"; s.display();s = x < y;cout << "x<y的结果true为1,false为0:"; s.display();s = x <= y;cout << "x<=y的结果true为1,false为0:"; s.display();cout << "x对y通分结果为:"; x.tongfen(x, y);s = x = y;cout << "x=y="; s.display();
}

运行结果:

目前方法不足与局限:
1)处理double型和float型数据时偷懒了,直接乘与1000,相当于转成int型了,因此只能计算到小数点后三位;如果改进的话,可以输入字符串的形式,再进行转换;
显示的时候,没有对比较运算的结果进行处理,只显示了0和1,没有转换成true或者false,便于查看与理解。

C++学习-类和对象相关推荐

  1. java学习--类与对象

    文章目录 java学习--类与对象 类的定义与对象的使用 类的私有成员的使用 java学习–类与对象 类的定义与对象的使用 类的定义与对象的使用 类的定义步骤: public 类名: //定义成员变量 ...

  2. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  3. C++入门学习 类与对象

    类与对象 普通大一新生,C++入门.老师上课不讲课只看视频讲解,效率低.临近期末总结巩固已经学习过的内容. 一.构造函数 定义 类对象被创建时,编译系统对象分配内存空间,并自动调用该构造函数-> ...

  4. Python学习——类与对象

    一.编程的两大思想 (1)面向过程 事物比较简单,用简单的线性思维即可解决 (2)面向对象 事物比较复杂,用简单的线性思维无法解决 (3)两者之间的关系 在面对复杂的问题时,宏观上是使用面向对象,但具 ...

  5. Java学习——类和对象(上)

    目录 一.类和对象 1.类的特点 2.类和对象的关系 3.总结 二.类的定义 1.类的定义步骤 2.代码示例 三.对象的使用 1.创建对象 2.使用对象 3.单个对象(代码) 4.多个对象(代码) 四 ...

  6. Java学习 --- 类与对象

    目录 一.问题需求 二.类与对象关系图 三.类与对象的关系 四.什么是类 五.什么是对象 六.对象的内存分布图 一.问题需求 有两只猫,第一只叫小白,年龄:1岁,颜色:白色,第二只叫小黑,年龄:2岁, ...

  7. Java 学习 类与对象讲解

    类与对象的概念 : 什么是类 什么是对象 类与对象指的是一种编程思想,其中类是类别的概念,对象是这个类别中一个具体的个例 比如: 学生类对应 某一名具体的学生   计算机类 对应我正在使用的这台计算机 ...

  8. java学习---类与对象

    java学习心得3 文章目录 java学习心得3 类 对象 关键字this 总结与反思 类 一 定义一个Java的类 属性 : 将数据存储在变量中 1成员变量 使用成员变量:对象名.变量名 使用成员方 ...

  9. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: 1 class Counter{ 2 private var va ...

最新文章

  1. iptables使用方法
  2. Virtex中的ILA属性、VIO属性
  3. lintcode:Unique Characters 判断字符串是否没有重复字符
  4. properties 资源文件读取
  5. Should i Backup all my domain controllers
  6. android 提供的方法,Android编程之创建自己的内容提供器实现方法
  7. linux网络是文件吗,linux网络配置文件是什么意思
  8. 关于字符匹配所引起的的问题
  9. 2018-2019-2 网络对抗技术 20165334 Exp7 网络欺诈防范
  10. Swing 添加超链接 打开页面
  11. Java开发求职总结
  12. 4. Python--Scipy库(上/1-6)
  13. Ipython安装错误集锦
  14. 文件夹内批量修改文件名称
  15. hash_map C++
  16. 详解:分治算法【Java实现】——汉诺塔问题
  17. 数列极限的四则运算法则
  18. 使用互传APP实现Android手机投屏到windows电脑
  19. 使用u启动为苹果笔记本重装win7系统教程
  20. gos-log高性能大日志检索中台

热门文章

  1. Android调用系统的拍照,打开相册功能
  2. 道德经--道经篇☞1-5章
  3. 怎样学好CSS?这篇文章教会你
  4. matlab Lidar Camara Calibrator使用方法及雷达点云对相机的标定
  5. Microsoft Excel 教程:如何在 Excel 中插入或删除行和列?
  6. 平面解析几何----过椭圆上一点作互相垂直的两条直线交椭圆于点AB,AB恒过定点M的坐标
  7. Android Q IMS update
  8. 卅年史诗!地球上出现过的CPU完全收藏 - (6-9) 确立x86地位创造商业奇迹的CPU系列——80x86系列
  9. 软件设计模式--第二章 创建型模式-- 单例模式
  10. 用 Java 手写一个植物大战僵尸简易版!