我们在讲解复制控制的时候举过赋值操作符重载的示例。我们先来看一个示例,回顾一下操作符重载的语法:
动手写9.3.1
动手写9.3.1展示了加法操作符的重载,示例将加法与加法赋值操作用于套餐类,其行为则是合并两个套餐类中的物品列表。运行结果如图9.3.1所示:
图9.3.1 操作符重载
从本示例中,我们可以看出一些操作符重载的一般规则:
1.形参的数量需要与操作符操作数的数目相同。在本示例中,操作符是“+”,所以需要左右有两个操作数。由于操作符的某个操作数可能是对象,因此操作符重载也可以写成类成员函数的形式,而用this指针充当第一个操作数。正如示例中展示的那样,带两个参数的操作符重载函数声明在类外,这也叫作非成员形式。针对不同的操作符类型,这两种形式可能会有一些规定或习惯,这在后面的章节中也会陆续提到。
2.操作符重载只适用于第3章中介绍的现有合法操作符,我们不能随机找两个符号“@@”写一个类似于“operator@@()”的操作符重载函数。
3.操作符重载必须有一个类类型的操作数。就拿这个例子来说,我们可以合并两个套餐,也可以重载乘法操作符来支持“combo * 2”的操作(将套餐每个物品数量翻倍),但是不能重载两个整型,也就是基本数据类型的乘法。因为基本数据类型的行为是系统已经定好的,不能也不适合修改。
4.不能修改操作符的优先级和结合性,C++也没有提供修改它们的途径。
5.重载的逻辑与“&&”、逻辑或“||”以及逗号操作符将不再有短路求值的特性,所以为了使程序的行为可以预测,我们要尽量避免重载这些操作符。(www.xing528.com)
接下来我们就来看一个重载逻辑与操作符的示例:
动手写9.3.2
在动手写9.3.2中我们定义了一个只有一个布尔值成员的类,并重载了与其关联的逻辑与操作符。运行结果如图9.3.2所示:
图9.3.2 逻辑短路失效
我们可以看到,虽然b1和b2都是false,且b4的计算结果已经可以确定,但是程序还是接着执行了一个逻辑与操作,而没有选择短路返回结果。
提示
在设计类的时候,对于操作符重载我们需要遵循以下的设计原则:
1.最好不要重载逗号、取址、逻辑或和逻辑与等具有系统内置意义的操作符。
2.在重载了算术操作符或位操作符之后,最好也要配套地重载相应的复合赋值操作符。
3.由于操作符重载的特殊性,调试起来并没有函数那么容易,因此能用函数代替的行为最好还是用函数。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。