目录
- 前言:
- 一:题目要求
- 1.单目运算:
- 2.双目运算
- 3.其他
- 函数
- 二:实现过程
- 的实现
- 的实现
- 2.1 GCD求最大公约数
- 2.2 构造函数
- 2.3 转换构造函数
- 2.4 类型转换函数
- 2.5 转换函数的显示调用
- 2.6 单目运算符
- 2.7 双目运算符
- 2.8 重载输出运算符
- 3.fraction_main.cpp的实现
- 四:总结
- 1.需要注意的地方:
- 2.可改进之处:
前言:
关于运算符重载的知识点:C++ 运算符重载
一:题目要求
用C++语言完成一个分数类(fraction)的构建,分数类实现的功能(函数)要求如下:
1.单目运算:
Inverse:取负运算(例:+2/3 -> -2/3,或者 -2/3 -> +2/3)、
Reciprocal:求倒数(例:2/3 -> 3/2)、
Reduction:约分(例:6/9 -> 2/3)、
DtoF: 输入是double型转成分数(例:0.25 -> 1/4)、
StoF: 输入是字符串型分数表示转成数值型分数(例“1/4”-> 1/4)
2.双目运算
算术运算(加、减、乘、除、通分)、
关系运算(>、<、>=、<=、==、!=)
3.其他
显示输出
函数
测试上述各项功能,并逐一输出结果到文件中保存。
二:实现过程
的实现
- GCD函数:帮助进行约分的实现
- 两个构造函数:一个是用两个int型分别给分子、分母赋值,且带默认参数,分子默认为0,分母默认为1(分母不能为0);另一个则是用fraction赋值
- 两个转换构造函数:实现输入double、字符串型转换成分数类
- 类型转换函数:将分数转换为double型
- DtoF:double转为fraction的显示调用函数,帮助后面各种运算符的实现
- FtoD:fraction转为double的显示调用函数,帮助后面各种运算符的实现
- 单目运算符:写成类成员函数的形式
- 双目运算符:写成友员函数的形式(因为有左值不是fraction类的情况,如果左值是fraction类,则写作类成员函数/友元函数都可)
- 重载输出流:实现显示输出
的实现
头文件中函数的实现
2.1 GCD求最大公约数
因为后续的约分函数中是分子分母同时除以最大公约数,因此GCD缺省返回1
2.2 构造函数
2.3 转换构造函数
2.4 类型转换函数
2.5 转换函数的显示调用
帮助后面各种运算符的实现
2.6 单目运算符
Inverse:取负运算
Reciprocal:求倒数
Reduction:约分
DtoF: 输入是double型转成分数
StoF: 输入是字符串型分数表示转成数值型分数
2.7 双目运算符
每个双目运算符都有三种形式:左值为double型,右值为fraction型、左值为fraction型,右值为double型、左值为fraction型、右值为fraction型。
2.8 重载输出运算符
输出为 分子/分母 的形式
3.fraction_main.cpp的实现
测试函数
四:总结
1.需要注意的地方:
- 分母不能为0
- 为保护数据,参数最好写成const的形式
- double类型不能以传统类型比较,注意浮点数的精度,具体精度可以由用户设定,本程序中在中设定了全局变量const double eps,可供用户修改
- 重载运算符时,根据是否需要改变自身的值来决定返回值是 fraction& 还是 fraction
- 输出到文件后记得关闭文件!!!
2.可改进之处:
- 单目运算符中的取负、求倒数、约分等由于题目要求的原因写成了函数形式,个人感觉写成重载运算符的方式更好一些
- main函数中的测试可以写的更多样一些,比如可以由用户输入数据、写一个分数计算器的形式等
- 错误处理还有许多方面需要完善
- 双目运算符中fraction除了与double进行各种算术运算,也可以添加其他各种数据类型,原理相差不大,可以自行添加
- fraction类中可以添加符号、值等数据,可能在后续的各种函数实现中会更加方便