运算符重载
运算符重载概述
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。
重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。
当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数类型与定义中的参数类型进行比较,决定选用最合适的定义。选择最合适的重载函数或重载运算符的过程,称为重载决策。
可重载运算符 / 不可重载运算符
下面是可重载的运算符列表:
分类 | 解释 |
---|---|
双目算术运算符 | + 、- 、* 、/ 、% |
关系运算符 | == 、!= 、< 、> 、<= 、>= |
逻辑运算符 | \|\| 、&& 、! |
单目运算符 | + 、- 、* 、& |
自增自减运算符 | ++ 、-- |
位运算符 | \| 、& 、~ 、^ 、<< 、>> |
赋值运算符 | = 、+= 、-= 、*= 、/= 、%= 、&= 、\|= 、^= 、<<= 、>>= |
空间申请与释放 | new 、delete 、new[] 、delete[] |
其他运算符 | () 、-> 、, 、[] |
C++ 智能指针
->
运算符。
下面是不可重载的运算符列表:
.
:成员访问运算符.
、-*
:成员指针访问运算符::
:域运算符sizeof
:长度运算符?:
:条件运算符#
: 预处理符号
重载运算符的一些规则和建议
- 对于
+
、-
、*
、/
、%
这些双目算术运算符和==
、!=
、<
、>
、<=
、>=
这些关系运算符来说,既可以使用成员函数的方式重载,也可以使用非成员函数的方式重载,如果是两个相同类型的相加,如一个Person
类型的数据和另外一个Person
类型的数据相加,则哪种方式都可以;但如果是一个int
类型的数据和Person
类型的数据相加,则要使用非成员函数的方式重载。建议:非成员函数的方式重载。 - 对于
+
、-
这两个单目运算符来说,既可以通过成员函数的方式重载,也可以使用非成员函数的方式重载。建议:非成员函数的方式重载。 - 对于
++
、--
这两个运算符来说,必须通过成员函数的方式重载,对于后置的操作符要有一个占位参数。 - 对于
<<
、>>
这两个流操作运算符来说,必须通过非成员函数的方式重载。 - 对于
=
、+=
、-=
、*=
、/=
、%=
、&=
、|=
、^=
、<<=
、>>=
这些赋值运算符来说,必须通过非成员函数的方式重载。 ()
、[]
、->
必须通过成员函数重载。- 不要重载
||
、&&
、!
、&
.
运算符重载的一些例子
vec2
1 | /** |
1 | /** |
Int
1 | /** |
1 | /** |
参考
- C++ 重载运算符和重载函数 | 菜鸟教程
- C++ Primer