练习基本上是照着源码打的,,主要是各种const想不清楚原因和来由。
以下是自己的代码,已存为bign.h
#include <stdio.h> #include <iostream> #include <string> //此处不用.h using namespace std;//使用命名空间std struct bign//C++中取消了tpyedef { //this 关键字表示的意思是 &x 所以用*this才能操作 不过为什么不能*this.len呢? int len,s[3000];// 定义成员变量 //定义构造函数 C++专属 bign() { len=1; memset(s,0,sizeof(s)); } //定义对于数组的=运算法则 bign operator = (const char* num)//此处的const何用? { len = strlen(num); for(int i=0;i<len;i++) s[i]=num[len-1-i]-'0'; //s[len-1-i]=num[i]-'0'; return *this; } //定义对于int变量的=运算法则 bign operator = (const int num) { char t[3000]; sprintf(t,"%d",num); *this=t;//此处已经运用了对于数组的赋值运算法则 len,s已经在内部实现 return *this; } //定义初始化方法 bign(int num) {*this = num;} bign(const char* num) {*this = num;}//此处要求必须为常量数组 // 定义成员函数 string str()const//此处的const表示不会在x.str()函数内部改变x的值 { string res="";//为string变量初始化 for(int i=0;i<len;i++) res = (char)(s[i]+'0')+res;//res累加顺序 if(res=="") res="0"; return res; } //定义加法 bign operator + (const bign& b) const //返回一个bign的运算结果 { bign res; res.len=0; for(int i=0,g=0;g||i<max(len,b.len);i++) { int x = g; //从上一次运算中取出累加余量 if(i<len) x += s[i]; if(i<b.len) x += b.s[i]; res.s[res.len++]=x%10; g=x/10; } return res; } //定义乘法 bign operator * (const bign& b) const //返回一个bign的运算结果 { bign res; res.len=0; for(int i=0;i<b.len;i++) { int g=0; bign tem; tem.len=0; for(int k=0;k<i;k++) { //tem.s[tem.len++]=0; tem.len++; } for(int j=0;j<len;j++) { int x = g + s[j]*b.s[i]; //从上一次运算中取出累乘余量 tem.s[tem.len++]=x%10; g=x/10; } res = res + tem; } return res; } //定义比较符号 bool operator < (const bign &b )const { if(len!=b.len) return len<b.len; else { for(int i=len-1;i>0;i--) { if(s[i]!=b.s[i]) return s[i]<b.s[i]; } } } bool operator > (const bign& b)const { return b<*this;} bool operator >= (const bign& b)const { return !(b>*this);} bool operator <= (const bign& b)const { return !(*this>b);} bool operator != (const bign& b)const { return (*this<b||*this>b);} bool operator == (const bign& b)const { return !(*this != b);} } ;//";" 太重要了 //为bign定义<<和>>运算符 必须在外部 istream& operator >>(istream &in,bign& x)//&的位置有关系么? { string s; in>>s;//in表示输入的流 x=s.c_str();//把string 转换为char* return in; } ostream& operator <<(ostream &out,const bign& x)//此处要求x为const的 { out<<x.str(); return out; }
提出了几个疑问,
1.为什么不能*this.len
2.bign operator = (const char* num)//此处的const何用?
3.istream& operator >>(istream &in,bign& x)//&的位置有关系么?