运算符重载

在计算机程序设计中，运算符重载（）是多态的一种。这里，运算符（比如+，=或==）被当作多态函数，它们的行为随着其参数类型的不同而不同。运算符并不一定总是符号。

简介
运算符重载通常只是一种语法糖。它可以简单地通过函数调用来模拟：
 a + b * c

在一个支持运算符重载的语言里，上面的写法要比下面的写法有效而简练：
 add(a, multiply(b, c))

（假设运算符* 的优先级高于运算符 +）

当一种语言允许运算符在某种情况下被隐式调用的时候，运算符重载将不只提供写法上的方便。例如，Ruby中的to_s运算符就是如此，它將一个对象轉換為字符串。

 用途 
运算符重载由于使程序员能够根据运算子类型的不同来决定运算符功能的不同而有多樣用途。C++中<<的使用就是一个例子。表达式
 a << 1

当a是整型变量时将返回a的两倍，但是当a是一个输出流时将向这个流中写入“1”。因为运算符重载允许程序员改变运算符通常的语义，慎重使用运算符重载通常被认为是一个好习惯。

 簡易實例 
以下是C++语言示例：#include <iostream>
using namespace std;
class point {
public:
	int x, y;
	point() {
		x = y = 0;
	}
	point(int ix, int iy) {
		x = ix;
		y = iy;
	}
	point pointxyadd(point pi) {
		return point(x + pi.x, y + pi.y);
	}
	point operator+(point pi) {
		return point(x + pi.x, y + pi.y);
	}
};
int main() {
	point p1(5, 10), p2(8, 13), p3, p4;
	p3 = p1.pointxyadd(p2);
	p4 = p1 + p2;
	cout << "p3 = (" << p3.x << ',' << p3.y << ')' << endl;
	cout << "p4 = (" << p4.x << ',' << p4.y << ')' << endl;
	return 0;
}

 分类 
 操作符不可重载可重载 新增新的操作符ML
PicoBinary functions with a symbolic name can be called infix.
Prolog
SmalltalkALGOL 68
Clojure
Eiffel
FortranIntroduced in Fortran 90.
Futhark
F#
HaskellType classes instead of overloading.
Io
Nim
R
Raku
Scala
Seed7
Swift 重设已有操作符BASIC
C
Go
Java字符串使用“+”运算符串联一般不认为是运算符重载，而是编译器“魔法”，即将相应操作转译为StringBuilder类的调用。
JavaScript
Modula-2
Objective-C
Pascal
TypeScript
Visual BasicAda
C#
C++
Ceylon
D
Dart
FreeBASIC
Groovy
Java
Kotlin
Lua
MATLAB
Object Pascal（Free Pascal，Delphi（2005年后））
PHP （使用魔术方法，数组访问接口，操作符扩展）
Perl
Python
Ruby
Rust
Visual Basic .NET

注释与引用

Category:运算符 (编程)