对运算符“+“实行重载,使之能用于两个复数相加

        运算符重载的方法是定义一个重载运算符的函数,使指定的运算符不仅能实现原有的功能,而且能实现在函数中指定的新的功能。在使用被重载的运算符时,系统就自动调用该函数,以实现相应的功能。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载。
        重载运算符的函数一般格式如下:
        函数类型 operator 运算符名称(形参表)
        {对运算符的重载处理}
例如,想将"+"用于Complex类(复数)的加法运算,函数的原型可以是这样的:
        Complex operator+(Complex&c1,Complex&c2);
在上面的一般格式中,operator是关键字,是专门用于定义重载运算符的函数的,运算符名称就是C++已有的运算符。注意:函数名是由operator和运算符组成。上面的"operator+"就是函数名,意思是"对运算符+'重载的函数"。只要掌握这点,就可以发现,这类函数和其他函数在形式上没有什么区别。两个形参是Complex类对象的引用,要求实参为Complex类对象。
        在定义了重载运算符的函数后,可以说:函数"operator+"重载了运算符+。在执行复数相加的表达式c1+c2时(假设c1和c2都已被定义为Complex类对象),系统就会调用operator+函数,把c1和c2作实参,与形参进行虚实结合。
        为了说明在运算符重载后,执行表达式就是调用函数的过程,可以把两个整数相加也想象为调用下面的函数:
        int operator+(int a,int b)
                {return(a+b);}
如果有表达式5+8,就调用此函数,将5和8作为调用函数时的实参,函数的返回值为13。这就是用函数的方法理解运算符。
编写程序:

运行结果:

程序分析:
        可以看到:两个程序的结构和执行过程基本上是相同的,作用相同,运行结果也相同。重载运算符是由相应的函数实现的。有人可能说,既然一样何必对运算符重载呢?我们要从用户的角度来看问题,虽然重载运算符所实现的功能完全可以用函数实现,但是使用运算符重载能使用户程序易于编写阅读和维护。在实际工作中,类的声明和类的使用往往是分离的。假如在声明Complex类时,对运算符+,-,*,/都进行了重载,那么使用这个类的用户在编程时可以完全不考虑函数是怎么实现的,放心大胆地直接使用+,-,*,/进行复数的运算即可,显然十分方便。
        对上面的运算符重载函数operator+还可以改写得更简练一些:
        Complex Complex :: operator+(Complex &c2)
                {return Complex(real+c2.real,imag+c2.imag);}
return语句中的Complex(real+c2.real, imag+c2.imag)是建立一个临时对象,它没有对象名,是一个无名对象。在建立临时对象过程中调用构造函数。return语句将此临时对象作为函数返回值。
请思考:在本例中能否将一个常量和一个复数对象相加?如
        c3=3+c2;                            //错误,与形参类型不匹配
应写成对象形式,如
        c3=Complex(3,0)+c2;        //正确,类型均为对象
说明:运算符被重载后,其原有的功能仍然保留,没有丧失或改变。例如,运算符"+"仍然可以用于int,float,double,char类型数据的运算,同时又增加了用于复数的功能。那么,同一个运算符可以代表不同的功能,编译系统是怎样判别该执行哪一个功能呢?是根据表达式的上下文决定的,即根据运算符两侧(如果是单目运算符则为一侧)的数据类型决定的,如对3+5,则执行整数加法,对2.6+4.5,则执行双精度数加法,对两个复数对象,则执行复数加法。
        通过本例,可以看到重载运算符的明显好处。本来,C++提供的运算符只能用于C++的标准类型数据的运算,但C++程序设计的重要基础是类和对象,如果C++的运算符都无法用于类对象(对于类对象不能直接进行赋值运算、数值运算、关系运算、逻辑运算和输入输出操作),则类和对象的应用将会受到很大限制,影响了类和对象的使用。
        为了解决这个问题,使类和对象有更强的生命力,C++采取的方法不是为类对象另外定义一批新的运算符,而是允许重载现有的运算符,使这些简单易用、众所周知的运算符能直接应用于自己定义的类对象。通过运算符重载,扩大了C++已有运算符的作用范围,使之能用于类对象。
        运算符重载对C++有重要的意义,把运算符重载和类结合起来,可以在C++程序中定义出很有实用意义而使用方便的新的数据类型。运算符重载使C++具有更好的扩充性和适应性。这是C++功能强大和最吸引人的一个特点。

  • 36
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值