运算符重载主要是让+-*、等等的运算符有我们自定义的功能。这样就可以让我们的代码变得更加简洁而易于理解
期中索引器使用的运算符是[],所以我把自定义索引器也放到一块来讲
首先来看看MSDN为我们列出的可以重载的运算符吧
运算符 | 可重载性 |
---|---|
+、-、!、~、++、--、true 和 false | 可以重载这些一元运算符。 |
+, -, *, /, %, &, |, ^, <<, >> | 可以重载这些二进制运算符。 |
==, !=, <, >, <=, >= | 比较运算符可以重载(但请参见本表后面的说明)。 |
&&, || | 条件逻辑运算符不能重载,但可使用能够重载的 & 和 | 进行计算。 |
[] | 不能重载数组索引运算符,但可定义索引器。 |
() | 不能重载转换运算符,但可定义新的转换运算符(请参见 explicit 和 implicit)。 |
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= | 赋值运算符不能重载,但 += 可使用 + 计算,等等。 |
=、.、?:、->、new、is、sizeof 和 typeof | 不能重载这些运算符。 |
我们挑几个来写一写代码
以下的代码是实现一个复数类的部分功能,以及为了展示一些代码我乱添加的一些无意义的功能
关于语法 大致上就是
public static Complex operator +(Complex c1, Complex c2)
注意参数的问题,一目运算符就一个参数,二目运算符就两个参数。正常也是不会犯错的。
另外还有一点要特别提一下
比较运算符(如果重载)必须成对重载;也就是说,如果重载 == ,也必须重载 != 。反之亦然,< 和 > 以及 <= 和 >= 同样如此。
如果像上面的代码一样重载了==而没有重载Equals()会丢出一个警告。
如果重载了一目++ --这类运算符。出现的那种a++;++a;a++ + ++a;这类的问题和基本类型的情况是一样的。通常也不喜欢写这种骗人的代码。
+=,-=,*=,这一类的会因为+ - *被重载而有新的意义。
下面是一些索引器的东西
关于索引器,我用很烂的方式构造了一个复述集合来使用索引器。
索引器允许类或结构的实例按照与数组相同的方式进行索引。索引器类似于属性,不同之处在于它们的访问器采用参数。
语法如下
public 类型 this [int i]
{
get { }
set { }
}
添加索引器后,就可以像数组一样使用下标([]运算符)来访问了。通常对GET 和 SET 模块的设计,能让索引器的功能变得十分强大。
相关文章地址:
http://msdn.microsoft.com/zh-cn/library/8edha89s(VS.80).aspx
http://msdn.microsoft.com/zh-cn/library/6x16t2tx(v=vs.80).aspx