一番修改后,发现比较函数如
friend bool operator<(BigAmount& ba1,BigAmount& ba2);
friend bool operator<(BigAmount& ba1,long long ba2);
它们只是函数参数不同,但是在函数内部的代码是一样的
bool operator<(BigAmount& ba1,BigAmount& ba2)
{
return ba1.CompareTo(ba2) == -1;
}
bool operator<(BigAmount& ba1,long long ba2)
{
return ba1.CompareTo(ba2) == -1;
}
毫无疑问这里需要想办法将两个代码合并。
观察代码发现,这两个函数都调用BigAmount的CompareTo函数,只不过一个调用的参数是“BigAmount&”类型,另一个是“long long”类型。
而后者只是将这个long long类型的参数转成BigAmount类型后,再调用前者。
int BigAmount::CompareTo(BigAmount& ba2)
{
//balabala
}
int BigAmount::CompareTo(long long ba2)
{
return CompareTo(BigAmount(ba2));
}
因此,我想如果能在传long long类型参数的时候就完成类型转换,就可以合并运算符重载函数。
我做了一点小测试,发现要做到这一点还是比较方便的。
首先将函数
friend bool operator<(BigAmount& ba1,BigAmount& ba2);
的两个参数前面,以及括号的后面分别加const关键字,如下所示
friend bool operator<(const BigAmount& ba1,const BigAmount& ba2);
这样一来当传入long long 类型的参数时,就可以自动转换为BigAmount类型。
但是这样还不够,函数内部调用的是CompareTo函数,这个函数的参数是BigAmount&类型,也要在前面加上const关键字。此外函数的参数列表括号之后也要加上const关键字。
//原来的代码
int CompareTo(BigAmount &ba2);
//修改后的代码
int CompareTo(const BigAmount &ba2) const;
CompareTo函数以及运算符函数的实现部分也作如上处理。
------------------------------------------------------------------------------------------
修改完成之后,我决定进行一下测试。由于运算符重载函数在执行时仅将参数传给CompareTo函数,所以测试的主要对象是修改后的CompareTo函数,而且因为只修改了函数的首部,所以只要判断程序是否正常运行即可。
在测试之前,先将CompareTo的long long参数版本的声明和实现注释掉。
然后将main函数里已有的测试代码复制到另一个地方,最后编写测试程序。(不清楚C++有哪些测试工具。。。)
int _tmain(int argc, _TCHAR* argv[])
{
BigAmount test1,test2;
long long testLong;
cout<<"请输入大整数1 以及大整数2:"<<endl;
cin>>test1>>test2;
cout<<"请输入long long类型的数值:"<<endl;
cin>>testLong;
cout<<"大整数1.CompareTo(大整数2)的结果是:"<<test1.CompareTo(test2)<<endl;
cout<<"大整数1.CompareTo(long long)的结果是:"<<test1.CompareTo(testLong)<<endl;
return 0;
}
int oldTest()
{
//这里存放原先的测试代码
}
编译程序,程序能正常运行。说明改动并没有出问题,删掉之前注释的CompareTo函数,并修改所有的比较运算符重载函数。