运算符重载,和函数重载一样,它允许我们在运算符的自然算法之外,自定义运算符的运算法则。如两个数组相加。
我们先来了解一下运算符重载的定义格式:
(以+为例)
返回类型 operator+(参数列表);
先举一个例子,运算符重载作为类成员函数的时候:
头文件:
class Array {
public:
int array[5];
Array operator+(Array a);
};
Array Array::operator+(Array a)
{
Array b;
for (int i = 0; i < 5; i++)
{
b.array[i] = this->array[i] + a.array[i];
}
return b;
}
main函数:
int main(void)
{
Array a,b,c;
for (int i = 0; i < 5; i++)
{
a.array[i] = i;
b.array[i] = i+5;
}
c = a + b;
for (int i = 0; i < 5; i++)
{
cout << c.array[i] << "\t";
}
return 0;
}
输出:
5 7 9 11 13
其中主函数中的
c = a + b;
C++并没有定义两个类的加法,这是我们使用运算符重载实现的。
Array operator+(Array a);
当运算符重载作为成员函数时,我们只需要传一个参数,这是因为+号是一个双目运算符,除了this指针指向的类之外,再传一个参数就可以运算。
那么运算符重载作为非成员函数的时候呢?
我们把头文件改一下,main函数不变
头文件:
#pragma once
class Array {
public:
int array[5];
};
Array operator+(Array a,Array b)
{
Array c;
for (int i = 0; i < 5; i++)
{
c.array[i] = a.array[i] + b.array[i];
}
return c;
}
输出:
5 7 9 11 13
是不是所有的运算符都可以重载呢?
答案是否定的:
以下是可以重载的运算符:
双目算术运算符
+, - , *,/,%
关系运算符
==,!= ,< ,>,<=,>=
逻辑运算符
||,&&,!
单目运算符
+,-,*,&
自增自减运算符
++,- -
位运算符
| ,& ,~,^,<< ,>>
赋值运算符
=, +=, -=, *=, /= , % = , &=, |=, ^=, <<=, >>=
空间申请与释放
new, delete, new[ ] , delete[]
其他运算符
以下是不可重载的运算符:
.:成员访问运算符
., ->:成员指针访问运算符
:::域运算符
sizeof:长度运算符
?::条件运算符
#: 预处理符号
编程起步,有不对的地方谢谢指正。😊