• 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;
    }
    
  • 相关阅读:
    day14 多态与抽象
    day13 类的补充
    day12 继承
    第三周总结 类、对象、包
    day11 细节记忆
    Dapper使用
    修改SQL Server 中数据库的Collation
    Web API 输出文件缓存
    Sql从邮件中提取国家代码
    解决Nuget:https://api.nuget.org/v3/index.json 访问不了的问题
  • 原文地址:https://www.cnblogs.com/lfyzoi/p/6731142.html
Copyright © 2020-2023  润新知