C++的运算符重载

介绍

  • 运算符重载的目的就是为自定义类型定义运算规则。对于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;
}
posted @ 2017-04-18 23:20  LFYZOI题解  阅读(232)  评论(0编辑  收藏  举报