运算符重载

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

语法

类型 **operator**运算符-符号 ( 参数列表 )

备注

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

重载运算符的名称为 operator x,其中 x 是运算符,如下表中所示。 例如,若要重载加法运算符,可以定义一个名为 operator + 的函数。 同样,若要重载加法/赋值运算符, += 请定义名为 operator + = 的函数。

可重定义的运算符

运算符 名称 类型
, 逗号 二进制
! 逻辑非 一元
!= 不相等 二进制
% Modulus 二进制
%= 取模赋值 二进制
& 位与 二进制
& 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++ 内置运算符、优先级和关联性
关键字