解:上述程序与例4.2程序的功能相同,只是在这里重载运算符有一个返回值,因此A++或++B的结果是一个整数值。程序的执行结果如下:n=7n=62.重载单目运算符“->”“->”运算符是成员访问运算符,这种一元运算符只能被重载为成员函数。......
2023-11-07
前面介绍过,运算符重载实质上就是函数重载,如果重载为成员函数,它就可以自由地访问本类的数据成员。在实际使用时,通过该类的某个对象(s)来访问重载的运算符。对于双目运算符,一个运算数是对象本身(s)的数据,由this指针给出,另一个运算数则需要通过运算符重载函数的参数(s1)来传递。下面分别介绍这两种情况。
1.重载双目运算符为类的成员函数
假设有一个类A,对于二元运算符op,如果重载运算符op使之能够实现表达式“obj1 op obj2”,其中obj1和obj2均为A类的对象。
若把op重载为A类的成员函数,该函数只有一个形参,形参的类型是obj2所属的类型。经过重载之后,表达式obj1 op obj2解释为:
obj1.operator op(obj2)
左边的对象obj1通过this指针传递,右边的对象obj2由参数传递。下面是一个重载运算符“+”为成员函数的方式实现两个字符串加法的程序。
上述程序中,声明了一个类MyClass,其中包含一个重载运算符“+”成员函数,它有一个形参,为MyClass对象,当执行“s3=s1+s2;”语句时(等价于s3=s1+(s2)),调用这个重载运算符“+”成员函数,其中定义一个局部变量str,其值为当前对象的name(s1.name)与参数的name(s2.name)的连接,最后返回MyClass(str),即调用重载构造函数建立一个对象并返回这个新建的对象,通过赋值运算符“=”将这个新建的对象赋给s3。程序执行结果如下:
s1:Visual C++
s2:6.0
s3:Visual C++6.0
s1:Visual C++
s2:6.0
从执行结果可以看到,在执行“s3=s1+s2;”语句后,s1和s2均没有改变,实际上,这个重载运算符“+”成员函数也可以设计为:
在上述修改后,程序的执行结果与前面的完全相同,该函数中定义了一个类对象tmp,将字符串连接的结果赋给tmp.name,最后返回这个对象。
若用this指针实现,对应的代码如下:
这样修改后,程序执行结果如下:
s1:Visual C++
s2:6.0
s3:Visual C++6.0
s1:Visual C++6.0
s2:6.0
从执行结果可以看到,s1发生了改变。这是因为当执行“s3=s1+s2;”语句时(等价于s3=s1+(s2)),调用这个重载运算符“+”成员函数,this指针指向s1,将字符串连接的结果赋给s1.name,最后执行“return*this;”返回s1,再通过赋值运算符“=”将s1对象赋给s3。这其中已经通过this指针改变了s1的值。
前面介绍了使用成员函数实现运算符重载的各种方法,不同的实现方法得到的结果会稍有区别,使用返回*this对象的方式时会修改当前对象,而采用局部对象的方式不会修改当前对象。在实际中要注意它们之间的差异。
【例4.4】设计一个日期类Date,包括年、月、日等私有数据成员。要求实现从计算机时钟获取当前日期(默认构造函数),输出日期和两日期相差的天数等功能。(www.chuimin.cn)
解:在VC++6.0中,从计算机时钟获取当前日期的函数为_strdate(date),它将当前日期自动存放在字符数组date中,其格式为MM/DD/YY,通过各位字符的分解可以计算出年、月和日。完整的程序如下:
上述Date类的描述如图4.2所示。程序的执行结果如下:
以前日期:2019.3.5
今日日期:2019.3.11
相距天数:16
图4.2 Date类描述
【例4.5】分析以下程序的执行结果。
解:上述程序中,分别重载双目运算符“+”和“-”的功能为两个向量的加法和减法。这里是采用成员函数的方式实现的。程序的执行结果如下:
v1=(6,8)
v2=(3,6)
v1+v2=(9,14)
v1-v2=(3,2)
2.重载双目运算符为类的友元函数
运算符也可以重载为类的友元函数,这样,它就可以自由地访问该类的任何数据成员。
假设有一个类A,对于双目运算符op,如果重载运算符op使之能够实现表达式“obj1 op obj2”,其中obj1和obj2均为A类的对象。
若把op重载为A类的友元函数,该函数有两个形参,经过重载之后,表达式obj1 op obj2解释为:
operator op(obj1,obj2)
左右两个对象obj1和obj2都由参数传递。
注意:重载运算符为成员函数和友元函数关键的区别在于成员函数具有this指针,而友元函数没有this指针。
【例4.6】将例4.5的类Vector中重载运算符改为友元函数实现。
解:将Vector类中的重载运算符改为等价的友元函数。程序如下:
本程序的执行结果与例4.5的结果完全相同。
有关C++程序设计基础教程的文章
解:上述程序与例4.2程序的功能相同,只是在这里重载运算符有一个返回值,因此A++或++B的结果是一个整数值。程序的执行结果如下:n=7n=62.重载单目运算符“->”“->”运算符是成员访问运算符,这种一元运算符只能被重载为成员函数。......
2023-11-07
在正常情况下,系统会为每一个类自动生成一个默认的完成上述功能的赋值运算符,当然,这种赋值只限于由一个类类型说明的对象之间赋值。图4.3对象内存分配可以重载运算符“=”来解决这个问题。在赋值运算符连用时,如s3=s2=s1,应使用方式2实现“=”运算符重载。......
2023-11-07
运算符重载函数的调用格式与普通成员函数的调用格式类似,以双目运算符重载成员函数为例,其调用格式如下:左运算对象双目运算符右运算对象例如:对于前面的Complex,设计如下主函数:其中,“s3=s1+s2;”和“s4=s1-s2;”两个语句就是调用运算符重载函数。该函数执行完毕,释放tmp对象。......
2023-11-07
当重载输出运算符“<<”用于输出时,相当于创建一个插入符函数。“函数体”中给出实现该插入符重载目的的代码。该语句等价于:cout<>”在C++中,“>>”运算符称为提取运算符,对它进行重载的函数称为提取符函数。......
2023-11-07
所谓运算符重载就是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时导致不同的行为,即完成不同的运算功能。在C++语言中,可以将运算符看着函数,运算符重载是通过运算符重载函数来实现的。C++运算符重载需要遵循的相关规则如下:不是所有的运算符都能重载,可以重载的运算符见表4.1所示,不能重载的运算符见表4.2所示。表4.1C++中可以重载的运算符表4.2C++中不能重载的运算符......
2023-11-07
前面已经学习过,在C++程序中建立和删除对象使用两个运算符new和delete。new与delete两个运算符用于动态管理内存,在大多数情况下,它们是非常有效的。这就要重载运算符new与delete,使其按照要求完成对内存的管理。而且,无论是否使用关键字static进行修饰,重载了的new和delete均为类的静态成员函数。在带有“参数表”时,应注意使用重载new的方式。程序执行结果如下:new1 operatordelete operatornew2 operatordelete operator......
2023-11-07
C++中下标运算符“[]”通常用于取数组的某个元素,下标运算符重载可以实现数组下标的越界检测等。重载下标运算符成员函数int&Assoc∷operator[]用于将单词及其次数添加到vec指向的区域中。......
2023-11-07
程序设计是指设计、编写和调试程序的方法与过程。由于程序是软件的本体,因此软件的质量主要通过程序的质量体现,因此,研究一种切实可行的程序设计方法至关重要。继承是面向对象程序设计方法的一个重要标志,利用继承机制可以大大提高程序的可重用性和可扩充性。......
2023-11-07
相关推荐