当看见这道应用并尝试解读代码时我绝对是一脸懵逼,不过研究了两天自己也尝试实现了一下,这里不去评论刘老师的代码,先说一些需要掌握的基础知识:
一、运算符重载
运算符重载大的分两种,第一种是成员函数重载,第二种是友元函数重载,查了一下资料,推荐的还是成员函数重载更好一点。具体内容可以从下面网站学习,非常全面:
https://wenku.baidu.com/view/0f30f808a6c30c2259019e31.html
https://wenku.baidu.com/view/b186ef4033687e21af45a9d5.html?sxts=1586509930380
掌握了上面的知识就可以贴代码一步一步分析了
二、代码分析
1、结构体部分
struct BigInteger{
string sr;int fh=1;
vector<int> sc;
void printf();
friend istream&operator>>(istream&input,BigInteger &);
friend ostream&operator<<(ostream&output,BigInteger &);
};
上面的sr字符串表示输入,即我们输入的每一组数都以一个串的形式被接受,fh变量表示符号,fh=1表示正数,fh=0表示负数,vector形式的sc为输出串。
关于输出我写了两个形式,一种是printf(),还有一种是流输出,当然还有一个流输入,printf()采用的是成员函数形式,流输入输出运算符重载用的是友元函数形式。
注意这个结构体内没有构造函数。
2、printf()的描述和使用以及>>和<<的重载
1)printf()函数
void BigInteger::printf()
{
if(fh==1)
{
for(vector<int>::iterator it=sc.end()-1;it!=sc.begin()-1;it--) cout<<*it;}
if(fh==0)
{
cout<<'-';
for(vector<int>::iterator it=sc.end()-1;it!=sc.begin()-1;it--) cout<<*it;
}
cout<<endl;
}
首先这一部分是写在结构体外部的,::是域作用符,表示它的作用域为BigInteger结构体。fh为符号变量,fh=1表示结果为正,如果结果为正,那么设置一个迭代器,倒着输出vector形式的sc串中的结果,
注意:对于vector数据类型,遍历最好用迭代器。
还有一个是为什么要倒着输出,因为我在做运算时是使用push_back向sc添加元素的,vector是一种类似队列的结构,而我们四则运算是从个位向十位百位这个方向进行的,存储顺序也是从个位向左存储,而输出又必须从左往右进行,比如480,存储的顺序是084,输出就要倒过来了。
然后是负数的情况,很明显在这里输出了一个负号。
2)>>和<<的重载
istream&operator>>(istream&input,BigInteger &c)
{
input>>c.sr;
return input;
}
这是输入,我们要输入的即一个未知长度的字符串sr,注意要写返回值,这一部分写在结构体外部。
ostream&operator<<(ostream&output,BigInteger &c)
{
if(c.fh==1)
{
for(vector<int>::iterator it=c.sc.end()-1;it!=c.sc.begin(