在 C++中,许多运算符都可以重载,但有一些运算符不能重载。以下是可重载的运算符和不可重载的运算符的分类说明。
可以重载的运算符
- 算术运算符:
• +
、-
、*
、/
(加、减、乘、除)
• %
(取模)
• +=
、-=
、*=
、/=
、%=
(复合赋值运算符)
• ++
、--
(自增、自减)
• +
(正号)、-
(负号)
- 关系运算符:
• ==
(等于)
• !=
(不等于)
• <
(小于)
• >
(大于)
• <=
(小于等于)
• >=
(大于等于)
- 位运算符:
• &
(按位与)
• |
(按位或)
• ^
(按位异或)
• ~
(按位取反)
• <<
、>>
(左移、右移)
• &=
、|=
、^=
、<<=
、>>=
(复合位运算符)
- 逻辑运算符:
• !
(逻辑非)
• &&
(逻辑与)
• ||
(逻辑或)
- 其他运算符:
• []
(下标运算符)
• ()
(函数调用运算符)
• ->
(成员指针访问运算符)
• new
、delete
(动态内存分配和释放运算符)
• new[]
、delete[]
(数组动态内存分配和释放运算符)
• ,
(逗号运算符)
• =
(赋值运算符)
• .*
(成员访问运算符,但只能作为类的成员函数重载)
不能重载的运算符
-
::
(域运算符) -
.*
(成员指针访问运算符,只能作为类的成员函数重载) -
.*=
(复合成员指针访问运算符) -
?:
(三目运算符) -
sizeof
(大小运算符) -
typeid
(类型信息运算符)
重载运算符的限制
- 不能改变运算符的优先级和结合性:
• 运算符的优先级和结合性是固定的,重载不会改变这些特性。
- 不能改变运算符的操作数数量:
• 例如,+
是二元运算符,重载后仍然需要两个操作数。
- 不能创建新的运算符:
• 只能重载已有的运算符。
- 重载函数的参数必须至少有一个用户定义类型的参数:
• 重载运算符的函数必须至少有一个参数是用户定义的类或结构体类型。
- 某些运算符只能作为类的成员函数重载:
• 例如,=
(赋值运算符)、[]
(下标运算符)、()
(函数调用运算符)、->
(成员指针访问运算符)。
通过重载运算符,可以为用户定义的类或结构体提供更自然的语法支持,使代码更易读、更易维护。