c++运算符重载

运算符重载遵循如下规则

  • 除类属关系运算符”.”、成员指针运算符”.*”、作用域运算符”::”、sizeof运算符和三目运算符”?:”以外,其他运算符都可以重载。
  • 重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构。

运算符重载的方式

重载为类的成员函数和重载为类的非成员函数。非成员函数通常是友元。

成员函数运算符

语法形式

1
2
3
4
<函数类型> operator <运算符>(<参数列表>)
{
函数体
}

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
using namespace std;
class A
{
private:
int value;
public:
A(int v = 0):value(v)
{}
A operator + (const A & right)
{
return A(value + right.value);
}
void print()
{
cout << value << endl;
}
};
int main()
{
A a(1);
A b(2);
A c = a + b;
c.print();
system("pause");
return 0;
}

友元函数运算符

语法形式

1
2
3
4
friend <函数类型> operator <运算符>(<参数列表>)
{
函数体
}

代码示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
using namespace std;

class A
{
private:
int value;
public:
A(int v = 0):value(v)
{}
friend A operator + (const A & left, const A & right);
void print()
{
cout << value << endl;
}
};
A operator + (const A & left, const A & right)
{
return A(left.value + right.value);
}
int main()
{
A a(1);
A b(2);
A c = a + b;
c.print();
system("pause");
return 0;
}

注意:
一般双目运算符重载用友元实现,但是以下一些双目运算符不能重载为类的友元函数:=、()、[]、->

思考

c++ 函数符号重载 返回类型是否为引用?

参考博客:c++ 函数符号重载 返回类型是否为引用问题 剖析