重载运算符
重载运算符有什么有哇!!!
C++预定义中的运算符的操作对象只局限于基本的内置数据类型,
但是对于我们自定义的类型(类)是没有办法操作的
。但是大多时候我们需要对我们定义的类型进行类似的运算,
这个时候就需要我们对这么运算符进行重新定义,赋予其新的功能,以满足自身的需求。
有什么要注意的嘛!!!(原则)
(1)为了防止用户对标准类型进行运算符重载,C++规定重载后的运算符的操作对象必须至少有一个是用户定义的类型
这是什么意思呢?
比如说现在有两个数:int number1,int number2,
那么number1+number2 求的是两个数的和,
但是如果你重载以后让着两个数相加为他们的乘积,这肯定是不合乎逻辑的。
可能重载以后会有二义性,导致程序不知道该执行哪一个(是自带的的还是重载后的函数)
(2)使用运算符不能违法运算符原来的句法规则。如不能将% 重载为一个操作数,
例如: int index;
%index;这种是不被允许的。
(3)不能修改运算符原先的优先级。
(4)不能创建一个新的运算符,例如不能定义operator** (···)来表示求幂
(5)不能进行重载的运算符:成员运算符,作用域运算符,条件运算符,sizeof运算符,typeid(一个RTTI运算符),const_cast、dynamic_cast、reinterpret_cast、static_cast强制类型转换运算
(6)大多数运算符可以通过成员函数和非成员函数进行重载但是下面这四种运算符只能通过成函数进行重载:
= 赋值运算符,()函数调用运算符,[ ]下标运算符,->通过指针访问类成员的运算符。
(7)除了上述的规则,其实我们还应该注意在重载运算符的时候遵守一些明智的规则:例如:不要将+运算符重载为交换两个对象的值。
那么 到底要怎么写呢???
1 struct matrix //自己定义的结构类型
2 {
3 ll A[5][5];
4 friend matrix operator * (matrix x,matrix y)
5 {
6 matrix z;
7 for (int i = 1;i <= 4;i++)
8 for (int j = 1;j <= 4;j++)
9 {
10 z.A[i][j] = 0;
11 for (int o = 1;o <= 4;o++)
12 z.A[i][j] = (z.A[i][j] + x.A[i][o] * y.A[o][j]) % mo;
13 }
14 return z;
15 }//这之间就是自己对运算符的重载
16 };
17 matrix fpow(matrix x,ll k)
18 {
19 if (k == 1) return x;
20 matrix t = fpow(x,k >> 1);
21 if (k & 1) return t * t * x;
22 return t * t;
23 }//又自己定义了一个快速幂运算
24 ll n;
25 matrix prc,frst;//两个结构体
(加油!--日常打气!)