 |
|
|
运算符重载(除非特别指明,否则本专栏的其余部分一律将其简称为“重载”)是指允许用户使用用户定义的类型编写表达式的能力。它允许用户定义的类型与预定义的类型具有相同的功能。
例如,通常需要编写类似于以下内容的代码,以将两个数字相加。很明显,sum 是两个数字之和。
int i = 5;
int sum = i + j;
如果可以使用代表复数的用户定义的类型来编写相同类型的表达式,那当然是最好不过了:
Complex i = 5;
Complex sum = i + j;
运算符重载允许为用户定义的类型重载(即指定明确的含义)诸如“+”这样的运算符。如果不进行重载,则用户需要编写以下代码:
Complex i = new Complex(5);
Complex sum = Complex.Add(i, j);
此代码可以很好地运行,但 Complex 类型并不能象语言中的预定义类型那样发挥作用。
任何事情都有特定的时间和场所
运算符重载是一个容易引起误解的语言功能,而且编程人员对待它的态度也大相径庭。一些人认为:用户使用这一功能编写的程序将令人费解,而且它也不应归于编程语言。另一些人则认为它是一个很不错的功能,在任何地方都可以使用。
这两种观点既包含正确的成分,但也有欠妥之处。应该承认,运算符重载可能会导致编写出的程序令人费解,但根据我的经验,即使不使用运算符重载,也很可能编写出令人费解的代码。在某些情况下,不使用重载甚至会使代码更加令人费解。
那些不分场合、随意使用重载的人“确实”在生产令人费解的代码。
在语言中之所以使用重载,是为了在概念上对用户的类或结构进行简化。只有在有助于提高用户所写代码的可读性时,才能对运算符进行重载。请注意,我们所说的检验标准是“更清晰”,而不是“更简短”。运用了运算符重载的类几乎总是会使代码变得更简短,但并不能每次都使代码变得更清晰(即可读性更强)。
为了说明这一点,我创建了多个重载示例。您需要仔细阅读这些代码,想一想哪个运算符进行了重载,重载的运算符执行了什么运算。
测验
1
BigNum n1 = new BigNum("123456789012345");
BigNum n2 = new BigNum("11111");
BigNum sum = n1 + n2;
B
Matrix m1 = loadMatrix();
Matrix m2 = loadMatrix();
Matrix result = m1 * m2;
iii
DBRow row = query.Execute();
while (!row.Done)
{
Viewer.Add(row);
row++;
}
IV
Account current = findAccount(idNum);
current += 5;
|