要求:
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. 【Ubuntu】Ubuntu14.04添加163的源
  2. java12章_【有书共读】java核心技术卷1--第12章
  3. qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架
  4. 格密码教程(试读):向量空间,基等介绍
  5. 7.3 MASS批量修改数据(Excel文件上传数据)
  6. 用java swing做连连看_java基于swing实现的连连看代码
  7. Android热修复技术初探(三):动态加载外部资源
  8. Javascript框架设计思路图
  9. Keytool 工具使用
  10. jQuery 三级联动
  11. CodeSmith注册
  12. ijkplayer 代码走读之 h264 解封装器应用详解
  13. 微信字号调整问题 html,解决h5 开发 ,设置手机字体大小微信设置字体大小 页面变形问题...
  14. Symbian游戏编程入门 (一) Symbian OS简介
  15. Android Studio 实现播放本地/网络视频
  16. HTML中的Switch开关
  17. onclick绑定多事件
  18. python与大数据是什么_大数据和python有什么区别
  19. 着色器_片断着色器详解
  20. 谢希仁的第七版计算机网络--第四章总结概述

热门文章

  1. oracle 11g rac adg 搭建实施
  2. qt 达梦数据库 driver not loaded
  3. SQL Server——规则是什么?规则和约束有什么不同?
  4. 5天破10亿的哪吒,为啥这么火,Python来分析 !
  5. 如何用记事本编辑HTML文档
  6. 基于mapreduce的汽车销售需求分析
  7. ATmega8,ATmega16,最小系统板,第一个好评来啦!
  8. Tarjan算法学习
  9. Android手机真正需要多少RAM?
  10. 中华巡游 | 第十二届第①天:农业考察,溯梦60、70、80年代