设计一个分数类要求: //使用函數以方便输出结果 //第一个数的分子与分母 //第二个数的分子与分母 //计算结果的分子与分母 //通过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
添砖加瓦例如,分数可以加减乘除这里留在再细说。
还有最后一点东西就是下面这个表格了,这是标准库中為了方便用户做出来的类型重定义: