运算符重载
当应用于类的实例时,operator
关键字将声明一个用于指定 operator-symbol 含义的函数。 这将为运算符提供多个含义,或者将“重载”它。 编译器通过检查其操作数类型来区分运算符不同的含义。
语法
type
operator
operator-symbol(parameter-list)
注解
你可以在全局或为各个类重新定义大多数内置运算符的函数。 重载运算符作为函数来实现。
重载运算符的名称是 operator
x,其中 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
本节内容
另请参阅
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈