C++运算符重载



运算符重载介绍


运算符重载就是对已有的运算符赋予新的含义,实现新的功能。


前面我们已经使用过运算符重载,如“+”,它可以对int、float、string类型进行加法运算。<<是C++中的左移运算符,但是在输出操作中与cout配合被称为流插入运算符,可以进行输出。>>是右移运算符,与cin配合使用被称为流提取运算符。它们都被称为运算符重载。


我们也可以根据我们的需要对C++中现有的运算符进行重载,来赋予这些运算符新的含义。加号运算符显然已经被重载过许多次了,但是这些都是系统预定义的数据类型可以使用,那么我们要让自己写的类也可以使用加号直接进行加法运算呐?如CTime类,重载+运算符,实现两个CTime对象的相加。



实现两个对象的相加


1.友元函数的形式,不重载+


介绍运算符重载前,我们看下如何来实现两个CTime对象相加。首先由于这个函数需要访问CTime这个类的私有成员,我们需要到CTime这个类中添加这个函数为友元函数的声明,因为这是一个将两个CTime对象相加,并返回它们的和的函数,所以参数和返回值都是CTime对象,在函数内部,我们采用三个临时变量来记录时针,分针,秒针的和,并且注意它们是否可以进位。最后,我们返回了一个CTime对象,这个返回对象会调用复制构造函数。


overload1.png


这是在main函数里面的调用,前面两个对象相加的值赋给了time3这个对象,并将它打印。


overload2.png


运行结果如下:我们可以通过计算看到这个结果是正确的。


overload3.png


2.友元函数的形式,重载+


我们上面没有通过运算符重载也实现了两个对象相加,这种函数调用是没有我们直接使用加号运算符直观的。下面我们就来对加号运算符进行重载。


要实现CTime重载+运算符实现两个CTime对象的相加,首先需要定义一个重载的运算符函数,此后在执行被重载的运算符时,系统将自动调用该运算符函数。运算符重载实际上是函数的重载。


运算符重载的格式:


返回类型 operator运算符(参数列表)


CTime operator+(CTime& time1, CTime& time2)


重载的运算符函数可以作为一般的函数,也可以作为类的成员函数。


这就是重载加号运算符的函数,这里我们依旧将它声明为CTime类的友元函数,所欲需要到CTime类添加这个函数为友元函数的声明,内部的实现和刚才那个实现相加功能的函数是一致的。


overload4.png


只是此时我们的调用方式就改变了。我们在使用加号运算符的时候,它会根据两个对象参数来调用函数,系统就会去查找在这个类里面是否有这个运算符的重载,如果有,就调用这个重载的函数,如果我们自己没有定义,显然系统也没有为我们预定义好这个类的对象的加法运算符,它就会报错。这个结果和刚才那个函数使用结果是一样的。但是这种调用方法显然很直观。


overload5.png


3.成员函数的形式,重载+


我们还可以直接将这个运算符重载为类的成员函数,如下:


CTime operator+(CTime& time)


为什么这个成员函数的声明只有一个参数呐?实际上是这样的:当我们声明加号运算符为成员函数之后,我们的调用方法依旧是下图这样的,但是编译器就会理解为下边红色方框中所示,它会认为加法操作符左边的对象就是调用这个这个成员函数的对象(不要忘了成员函数的调用必须通过对象),而右边的对象才是函数参数列表里面那个对象。所以运算符的重载作为成员函数的话总是会比不作为成员函数要少一个参数。


overload6.png


上面用友元函数重载的加法运算符的实现直接从第一个实现加法功能的函数里面拷贝出来就可以使用,但是在成为成员函数之后,我们就需要改变一下实现了,它的参数列表里面只有一个,那是因为左操作数在这里变成了调用它的对象,所以左操作数那个对象就有了this指针,这样,成员函数里面我们依旧是对两个对象的操作,只是第一个操作数访问的方式改变了以下而已。


overload7.png


我们利用上面的调用,结果还是同上面两个方法的。



【本文由麦子学院独家原创,转载请注明出处并保留原文链接】

logo
© 2012-2016 www.maiziedu.com
蜀ICP备13014270号-4 Version 5.0.0 release20160127
有一位课程导师想与你聊聊

免费电话咨询