重载运算符 可以对我们自己定义的类型进行一个运算(类和对象中用的比较多一些吧),比如结构体之间的一个运算。运算符重载是一种形式的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函数中的代码几乎和普通非高精度代码没有太大的区别。
之后会更一个莫队学习,莫队的板子也是用到了重载运算符。