运算符重载












在计算机程序设计中,运算符重载英语:operator overloading)是多态的一种。这里,运算符(比如+===)被当作多态函数,他们的行为随着其参数类型的不同而不同。运算符并不一定总是符号。


运算符重载通常只是一种语法糖。它可以简单地通过函数调用来模拟:


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;
}


分类


支持运算符重载和定义新运算符的语言:



  • PostgreSQL的SQL方言

  • Ruby

  • Haskell


支持运算符重载的语言:



  • Ada

  • C++

  • C#

  • D

  • Perl

  • Python


  • Pico(某种程度上)


  • Pascal(仅Free Pascal Dialect)

  • FreeBASIC


  • Visual Basic(需要Visual Basic .NET 2008或更高版本)

  • Delphi

  • Lua


不支持运算符重载的语言:



  • C

  • Java

  • Objective-C





Popular posts from this blog

Lambaréné

Chris Pine

Kashihara Line