本节书摘来自华章出版社《面向对象的思考过程(原书第4版)》一书中的第3章,第3.4节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3.4 操作符重载
有些面向对象的语言允许你重载操作符。C++是其中的一个例子。操作符重载允许你修改一个操作符的含义。例如,当大多数人看到一个加号时,会假设它代表加法运算。如果你看到以下恒等式
x = 5 + 6 ;
你会认为x的值是11。在这种情况下你是对的。
然而,有时加号也会代表其他含义。例如下面的代码:
你可能期望Name等于Joe Smith。这里重载的加号用来进行字符串连接操作。
字符串连接
将两个独立的字符串合并为一个新的单个字符串,称为字符串连接。
在字符串上下文中,加号并不表示整数或浮点数的加法操作,而是指字符串的连接。
那么矩阵加法呢?比如有以下代码:
这里的加号会进行矩阵加法,而不是整数或浮点数的加法。
重载是一种非常强大的机制。然而,它可以完全迷惑阅读和维护代码的人。事实上,开发人员也可能会迷惑自己。如果极端点,可以把加法操作修改为执行减法。操作符重载给予了你修改操作符含义的能力。因此,如果加号被修改为执行减法,以下的代码会导致x的值为-1:
x = 5 + 6 ;
近代面向对象的语言(比如Java、.NET和Objective-C)不允许重载操作符。
尽管这些语言没有提供重载操作符的选项,但这些语言自身重载了加号用于字符串连接。Java的设计者很可能认为操作符重载弊大于利。如果你在C++中必须使用操作符重载,请认真地加入正确的文档和注释,以免迷惑使用该类的人。