运算符重载

当应用于类的实例时,operator 关键字将声明一个用于指定 operator-symbol 含义的函数。 这将为运算符提供多个含义,或者将“重载”它。 编译器通过检查其操作数类型来区分运算符不同的含义。

语法

typeoperatoroperator-symbol(parameter-list)

注解

你可以在全局或为各个类重新定义大多数内置运算符的函数。 重载运算符作为函数来实现。

重载运算符的名称是 operatorx,其中 x 为下表中显示的运算符。 例如,若要重载加法运算符,需要定义一个名为“operator+”的函数。 同样地,若要重载加法/赋值运算符 +=,需要定义一个名为“operator+=”的函数。

可重定义的运算符

运算符 名称 类型
Comma 二进制
! 逻辑非 一元
!= 不相等 二进制
% 取模 二进制
%= 取模赋值 二进制
& 位与 二进制
& Address-of 一元
&& 逻辑与 二进制
&= 按位“与”赋值 二进制
( ) 函数调用
( ) 转换运算符 一元
* 乘法 二进制
* 指针取消引用 一元
*= 乘法赋值 二进制
+ 附加内容 二进制
+ 一元加 一元
++ 递增 1 一元
+= 加法赋值 二进制
- 二进制
- 一元求反 一元
-- 递减 1 一元
-= 减法赋值 二进制
-> 成员选择 二进制
->* 指向成员的指针选定内容 二进制
/ 分部 二进制
/= 除法赋值 二进制
< 小于 二进制
<< 左移 二进制
<<= 左移赋值 二进制
<= 小于或等于 二进制
= 赋值 二进制
== 等式 二进制
> 大于 二进制
>= 大于或等于 二进制
>> 右移 二进制
>>= 右移赋值 二进制
[ ] 数组下标
^ 异或 二进制
^= 异或赋值 二进制
| 位或 二进制
|= 按位“与或”赋值 二进制
|| 逻辑或 二进制
~ 二进制反码 一元
delete 删除
new 新建​​
转换运算符 转换运算符 一元

1 存在两个一元递增和递减运算符版本:前置递增和后置递增。

有关详细信息,请参阅运算符重载的一般规则。 以下主题对各种类别的重载运算符的约束进行了介绍:

无法重载下表中显示的运算符。 该表包括预处理器符号 ###

不可重定义的运算符

运算符 名称
. 成员选择
.* 指向成员的指针选定内容
:: 范围解析
? : 条件逻辑
# 预处理器转换为字符串
## 预处理器串联

尽管通常是在代码中遇到重载运算符时由编译器对其进行隐式调用,但也可以按照与调用任何成员或非成员函数相同的方式来显式调用重载运算符:

Point pt;
pt.operator+( 3 );  // Call addition operator to add 3 to pt.

示例

以下示例重载 + 运算符,将两个复数相加并返回结果。

// operator_overloading.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

struct Complex {
   Complex( double r, double i ) : re(r), im(i) {}
   Complex operator+( Complex &other );
   void Display( ) {   cout << re << ", " << im << endl; }
private:
   double re, im;
};

// Operator overloaded using a member function
Complex Complex::operator+( Complex &other ) {
   return Complex( re + other.re, im + other.im );
}

int main() {
   Complex a = Complex( 1.2, 3.4 );
   Complex b = Complex( 5.6, 7.8 );
   Complex c = Complex( 0.0, 0.0 );

   c = a + b;
   c.Display();
}
6.8, 11.2

本节内容

另请参阅

C++ 内置运算符、优先级和关联性
关键字