理论教育 运算符重载-方法|面向对象程序设计

运算符重载-方法|面向对象程序设计

时间:2023-10-25 理论教育 版权反馈
【摘要】:运算符重载函数的函数名由operator和运算符组成。运算符重载不能改变该运算符用于内部类型对象的含义。运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

运算符重载-方法|面向对象程序设计

1.重载运算符

运算符重载是通过创建运算符函数实现的,运算符函数定义了重载的运算符将要进行的操作。运算符函数的定义与其他函数的定义类似,唯一的区别是运算符函数的函数名是由关键字operator和其后要重载的运算符符号构成的。运算符函数定义的一般格式如下:

在上面的运算符重载的一般格式中,返回类型说明符是运算符重载函数的返回值类型,operator是关键字,专门用于定义重载运算符的函数,运算符符号是用于重载的运算符,也即是C++提供给用户的预定义的运算符。运算符重载函数的函数名由operator和运算符组成。

【例6.2】改写例6.1,重载运算符“+”和“-”,使之能用于两个复数相加和相减操作。

比较例6.1和例6.2可知:

(1)在例6.2中分别以operator+函数和operator-函数取代了例6.1中的add()函数和sub()函数,而且只是函数名不同,函数体和函数返回值的类型都是相同的。

(2)在main()函数中,以“c3=c1+c2”及“c4=c1-c2”取代了例6.1 中的“c3=c1.add(c2)”和“c4=c1.sub(c2)”。

2.运算符重载遵循的规则

(1)重载之后的运算符不能改变运算符的优先级和结合性,也不能改变运算符操作数的个数及语法结构,即不能改变运算符的本意。

(2)C++中的大部分运算符都是可以重载的,但下列运算符是不能重载的:

.(成员访问运算符)

.∗(成员指针运算符)

::(作用域运算符)(www.daowen.com)

sizeof(长度运算符)

?:(条件运算符)

(3)重载运算符限制在C++语言中已有的运算符范围内的允许重载的运算符之中,不能创建新的运算符,如:

int operator@(Complex,int); //error

(4)运算符重载实质上是函数重载,因此编译程序对运算符重载的选择,遵循函数重载的选择原则。

(5)运算符重载不能改变该运算符用于内部类型对象的含义。它只能和用户自定义类型的对象一起使用,或者用于用户自定义类型的对象和内部类型的对象混合使用时。

(6)运算符重载是针对新类型数据的实际需要对原有运算符进行的适当的改造,重载的功能应当与原有功能相类似,避免没有目的地使用重载运算符。

(7)重载的运算符只能是用于用户自定义类型,否则就不是重载而是改变了现有的C++标准数据类型的运算符的规则。

(8)用户自定义类的运算符一般都必须重载后方可使用,但两个例外,运算符“=”和“&”不必用户重载。

(9)重载运算符的函数不能有默认的参数,否则便改变了运算符的参数个数,导致与第(1)点相矛盾。

(10)运算符重载可以通过成员函数的形式,也可以通过友元函数,或非成员非友元的普通函数。

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

我要反馈