重载函数的概念也可以应用于运算符。在将C#运算符应用到用户定义的数据类型时,运算符重载为它们提供额外的能力。只可以重载预定义的C#运算符组。
运算符重载的必要性
大多数内置数据类型都有与它们相关的预定义运算符。例如:带有运算符+、-、*和/的C#数据类型int为数学运算提供支持。类是用户定义的数据类型的示例。对用户定义的数据类型进行运算不像对内置数据类型进行运算那么简单。要使用具有用户定义的数据类型的运算符,需要根据程序员的需求重载它们。
通过为运算符定义函数,可以重载运算符。关于这种运算符的函数用operator关键字来声明。
可以把运算符看作为编译器内部的函数。例如,表达式a+b可看作为+(a,b)。程序也可以通过编写带有类似签名的适当函数重载这些函数。为运算符指定额外任务的函数称为运算符函数。
operator关键字和要被重载的运算符用作函数名。
例如,为了重载+运算符,使用下面的语法定义运算符函数:
<access specifier>className operator + (parameters)
{
//Code
}
以下代码显示了运算符重载的用法:
using System;
class Distance
{
int dist;
public Distance(int d)
{
this.dist = d;
}
public static Distance operator + (Distance d1,Distence d2)
{
return new Distance(d1.dist + d2.dist);
}
public void showDistance()
{
Console.WriteLine(dist);
}
}
class Program
{
static void Main(string[] args)
{
Distance d1 = new Distance(3);
Distance d2 = new Distance(10);
Distance d3;
d3 = d1 + d2;
d3.showDistance();
}
}
在上述代码中,重载了+运算符以加上存储在Distance类的对象中的值。编译器将语句d1+d2解释为operator +(d1,d2),这里用运算符的第二个操作数调用了第一个操作数的运算符函数。
与函数调用相比,用户可能更容易理解运算符表示法,因为它更接近现实生活中的做法。将运算符与用户定义的数据类型关联包括重载它们。
下表描述了C#中可用的各个运算符的重载能力。
运算符 | 描述 |
---|---|
+、-、!、~、++、– | 这些一元运算符 需要一个操作数,可以被重载。 |
+、-、*、/、% | 这些二元运算符需要两个操作数,可以被重载。 |
==、!=、<、>、<=、>= | 比较运算符可以被重载 |
&&、|| | 条件逻辑运算符不能被直接重载,但是它们使用可以被重载的&和\求值。 |
+=、-=、*=、/=、%=、= | 赋值运算符不能被重载。 |
注释
如果重载比较运算符,那么必须成对重载;即,如果重载==,那么必须也重载!=。反之亦然。类似地,<和>,以及<=和>=也是如此。
小问题:
以下哪个代码段给出在类Complex中重载运算符道德正确语法?
a.public static Complex operator - (Cpmplex c1, Complex c2){ //code }
b.public static Complex -(Complex c1, Complex c2){ //code }
c.public static Complex operator ( Complex c1, Complex c2){ //code }
d.public static -operator Complex( Complex c1,Complex c2){ //code }
答案:a.public static Complex operator - (Cpmplex c1, Complex c2){