12.3.2 二元运算符

下面的清单为二元运算符重复了OverloadingUnaryOperators.cpp,于是就有了所有可重载运算符的例子。全局版本和成员函数版本都在里面。

12.3.2 二元运算符 - 图1

12.3.2 二元运算符 - 图2

12.3.2 二元运算符 - 图3

12.3.2 二元运算符 - 图4

12.3.2 二元运算符 - 图5

12.3.2 二元运算符 - 图6

12.3.2 二元运算符 - 图7

12.3.2 二元运算符 - 图8

12.3.2 二元运算符 - 图9

12.3.2 二元运算符 - 图10

可以看到operator=只允许作为成员函数。这将在后面解释。

请注意在运算符重载中所有赋值运算符都有代码检测自赋值(self-assignment),这是总原则。在某些情况下,这是不需要的。例如,对于operator+=,我们总是习惯写A+=A,让A与自己相加。检测自赋值最重要的地方是operator=,因为复杂的对象可能因为它而发生灾难性的结果(在一些情况下这不会有问题,但不管怎么说,在写operator=时,应该小心一些)。

在前两个例子中重载的运算符处理的是单一类型。也可以重载运算符处理混合类型,所以可以“将苹果与橙子相加”。然而,在开始进行运算符重载之前,应该看一下本章后面有关自动类型转换的一节。在适当的地方使用类型转换可以减少许多运算符重载。