介绍
-
运算符重载的目的就是为自定义类型定义运算规则。对于int、double等数据类型,我们已经习惯于使用A+B, A-B, A*B等方式对其进行运算,那么对于我们自己定义的类型,如何也能实现这种形式的运算呢?这就是运算符重载要达到的效果。
-
高精度运算是个典型的例子:在天文学计算中会涉及天文数字的计算,数字的位数可能会有几百位,即使使用long long类型也远不能满足需要,因其能表示的数值范围太小,一定会发生溢出,这时的解决方法是使用结构体自定义类型:使用一个数组,将数组的每一位存储在数组的一个空间内,这样就可以表达很大的数字(本文的例子不考虑负数的情况,且只以加法运算举例)
struct BigNum{
int len; //数字位数
int s[201]; //存储数字,最多存储200位长度的数字,留下一个存储可能存在的进位
}
- 我们期望通过运算符重载可以达到以下效果
int main(){
BigNum n1, n2;
cin>>n1>>n2; //为BigNum类型重载“>>”运算符
n1+=n2; //为BigNum类型重载“+=”运算符
cout<<n1; //为BigNum类型重载“<<”运算符
return 0;
}
- 重载代码如下
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct BigNum{
int len;
int s[201];
};
//重载“+”运算符
BigNum operator+(const BigNum & A, const BigNum & B){
BigNum result;
int len=max(A.len, B.len)+1;
int jw;
for(int i=0, jw=0; i<=len; i++){ //一边加对应位一边进位
result.s[i]=A.s[i]+B.s[i]+jw;
jw=result.s[i]/10;
result.s[i]%=10;
}
if(result.s[len]==0) len--;
result.len=len;
return result;
}
//重载输出“<<”运算符
ostream & operator<<(ostream & out, const BigNum & num){
for(int i=num.len-1; i>=0; i--)
//数字从低位开始在数组中正序存储,故逆序输出
out<<num.s[i];
return out;
}
//重载输入“>>”运算符
istream & operator>>(istream & in, BigNum & num){
char temp[202];
cin>>temp; //将数字作为字符串读入
int length=strlen(temp);
num.len=length;
int i=0, j=length-1;
while(j>=0)
//将字符串的每个字符(数位)从低位开始正序存入数组中
num.s[i++]=temp[j--]-'0';
return in;
}
int main(){
BigNum n1, n2;
cin>>n1>>n2; //为BigNum类型重载“>>”运算符
//n1+=n2; //为BigNum类型重载“+=”运算符
cout<<n1+n2; //为BigNum类型重载“<<”运算符
return 0;
}