天天看点

《面向对象的思考过程(原书第4版)》一3.4 操作符重载

有些面向对象的语言允许你重载操作符。c++是其中的一个例子。操作符重载允许你修改一个操作符的含义。例如,当大多数人看到一个加号时,会假设它代表加法运算。如果你看到以下恒等式

你会认为x的值是11。在这种情况下你是对的。

然而,有时加号也会代表其他含义。例如下面的代码:

《面向对象的思考过程(原书第4版)》一3.4 操作符重载

你可能期望name等于joe smith。这里重载的加号用来进行字符串连接操作。

字符串连接

将两个独立的字符串合并为一个新的单个字符串,称为字符串连接。

在字符串上下文中,加号并不表示整数或浮点数的加法操作,而是指字符串的连接。

那么矩阵加法呢?比如有以下代码:

《面向对象的思考过程(原书第4版)》一3.4 操作符重载

这里的加号会进行矩阵加法,而不是整数或浮点数的加法。

重载是一种非常强大的机制。然而,它可以完全迷惑阅读和维护代码的人。事实上,开发人员也可能会迷惑自己。如果极端点,可以把加法操作修改为执行减法。操作符重载给予了你修改操作符含义的能力。因此,如果加号被修改为执行减法,以下的代码会导致x的值为-1:

近代面向对象的语言(比如java、.net和objective-c)不允许重载操作符。

尽管这些语言没有提供重载操作符的选项,但这些语言自身重载了加号用于字符串连接。java的设计者很可能认为操作符重载弊大于利。如果你在c++中必须使用操作符重载,请认真地加入正确的文档和注释,以免迷惑使用该类的人。