首页 理论教育 C++操作符重载规则

C++操作符重载规则

时间:2023-08-20 理论教育 版权反馈
【摘要】:我们先来看一个示例,回顾一下操作符重载的语法:动手写9.3.1动手写9.3.1展示了加法操作符的重载,示例将加法与加法赋值操作用于套餐类,其行为则是合并两个套餐类中的物品列表。运行结果如图9.3.1所示:图9.3.1操作符重载从本示例中,我们可以看出一些操作符重载的一般规则:1.形参的数量需要与操作符操作数的数目相同。

C++操作符重载规则

我们在讲解复制控制的时候举过赋值操作符重载的示例。我们先来看一个示例,回顾一下操作符重载的语法:

动手写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.由于操作符重载的特殊性,调试起来并没有函数那么容易,因此能用函数代替的行为最好还是用函数。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈