重载运算符  可以对我们自己定义的类型进行一个运算(类和对象中用的比较多一些吧),比如结构体之间的一个运算。运算符重载是一种形式的C++多态。我是为什么学呢,因为很多板子都用了这么个东西。

重载运算符基本形态

<返回类型说明符> operator <运算符符号>(<参数表>)
{
 
     <函数体>
 
}
举个简单的例子哈:


#include<bits/stdc++.h>
using namespace std;
struct ichar{
	char a;
}; 
char operator+(ichar i1,ichar i2)
{
	int a,b;
	a = i1.a - 48;
	b = i2.a - 48;
	char c;
	c = a+b+48;
	return c;
}
int main()
{
	ichar i1,i2;
	cin>>i1.a>>i2.a;
	cout<<i1+i2<<endl;
}

在例子中,我们获取了char 类型的 两个数字字符,然后通过结构体的运算来获取的两个字符,然后进行转换数字再相加然后转换成字符,这里直接用ascii码就可以。

——————————————————————

下面就看一个高精度阶乘加法的例子 ,洛谷P1009题,来感受一下重载运算符

#include<bits/stdc++.h>
using namespace std;
const int maxn = 500;
struct bigint{
	int len , a[maxn];
	bigint(int x = 0){//这里是对大数进行的默认赋值,主要是应用在main里面,积累阶乘要用1,积累和用0 
		memset(a,0,sizeof(a));
		for(len=0;x;x=x/10) a[len++]=x%10; 
		len = max(len,1);//即使是0,它也是有位数的 
	}
	int &operator[](int i){//重载引用的运算符[],这样可以让其他的调用修改内部的值 ,主要还是起到返回作用。 
		return a[i];
	}
	void flatten(int L){//这里是用来进位计算的 
		for(int i=0;i<L;i++){
			a[i+1]+=a[i]/10;
			a[i]%=10;
			if(a[i])	len=i+1;//用来计算实际位数,因为L尽量传了更大的位数 
		}
	}
	void print(){
		for(int i=len-1;i>=0;i--)//打印不比多说了 
			printf("%d",a[i]);
	}
};
bigint operator+(bigint a,bigint b)
{
	bigint c;
	int len = max(a.len,b.len);
	for(int i=0;i<len;i++)
		c[i]+=a[i]+b[i];//这里c[i]  a[i] b[i]就是重载运算符[]的实际作用 
	c.flatten(len+2);
	return c;
}
bigint operator*(bigint a,bigint b)
{
	bigint c;
	int len = a.len+b.len;
	for(int i=0;i<a.len;i++)
		for(int j=0;j<=b.len;j++)
			c[i+j]+=a[i]*b[j];
	c.flatten(len+11);
	return c;
}
int main()
{
	int n;
	cin>>n;
	bigint s(0);//这里就用括号这种形式赋初值 
	bigint t(1);
	for(int i=1;i<=n;i++)
	{
		t = t*i;//这些都是通过重载运算符进行运算的 
		s = s+t;
	}
	s.print();//调用大数s的输出 
}


这里的main函数中的代码几乎和普通非高精度代码没有太大的区别。

之后会更一个莫队学习,莫队的板子也是用到了重载运算符。