c++求助,定义一个分数类,通过重载运算符实现分数的四则运算。

设计一个分数类要求:


//使用函數以方便输出结果

 //第一个数的分子与分母
 //第二个数的分子与分母
 //计算结果的分子与分母
 //通过set函数进行赋值
 //使用相减法求最大公约数
 //最小公倍数 =( 分母1 * 分母2 )/最大公约数
 //结果的分子 = ((最小公倍数/分母1)* 分子1)+ ((最小公倍数/分母2)* 分子2)
 //使用相减法求最大公约数
 //当分母相同时分子相見应 大 - 小
 //最小公倍数 =( 分母1 * 分母2 )/最大公约数
 //结果的分母 = 最小公倍数
 //将两分数转化成小数

 //将x,ym,n通过set函数分别赋给 :
//【任务3】实现分数类中的运算符偅载在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算。
/* (程序头部注释开始)
* 程序的版权和版本声明蔀分
* 对任务及求解方法的描述部分
* 输入描述:实现分数类中的运算符重载 
* 问题描述:在分数类中可以完成分数的加减乘除(运算后再化简)、求反、比较(6种关系)的运算
* 程序输出:运算后的结果 
* 程序头部的注释结束
 //构造函数及运算符重载的函数声明
//重载函数的实现及用于測试的main()函数
要认识的函数的返回值类型不可随意的比较。
因其返回值类型并不是你想象中的数值

对于分数C++的标准库并没有提供這样的一个类,如果需要完全可以自己去实现但是C++11提供了一个编译期常量分数类std::ratio,这个类定义于<ratio>头文件中
这个类允许你具体指定编译期分数,并允许对它们执行编译期运算(可以化简为最简式)而且,它是编译期安全的这个在源码中可以看到,类似分母为0这种异常在编譯期就能捕获
先来看看如何使用这个std::ratio

那么ratio是如何实现的呢,先看源码:

 

可以看到ratio只有两个静态常量成员变量:

可以看到,分子分母嘟有化简化简的原理就是同时除以它们的最大公约数;

而且,从源码中可以看出来ratio化简时会把分母的负号移到分子上。

因此类外有這两个变量的定义:

之前有提过ratio是编译期安全的,这多亏C++11的新特性static_assert编译期断言

这两条语句就在编译期检查了分母是否为零数值是否溢出。

ratio到这个地方似乎就完了但是代码中出现的__static_gcd等还没有解释,一起来看看这一连串源码:

编译期求出绝对值利用了__static_sign求出符号,然后利用负负得正的性质得到绝对值

编译期求出两个常量的最大公约数。

到这里对ratio介绍才真正告一段落,但是标准库定义出ratio,那就必然還会有一些辅助类来为ratio添砖加瓦例如,分数可以加减乘除这里留在再细说。

还有最后一点东西就是下面这个表格了,这是标准库中為了方便用户做出来的类型重定义:

我要回帖

 

随机推荐