解:上述程序与例4.2程序的功能相同,只是在这里重载运算符有一个返回值,因此A++或++B的结果是一个整数值。程序的执行结果如下:n=7n=62.重载单目运算符“->”“->”运算符是成员访问运算符,这种一元运算符只能被重载为成员函数。......
2023-11-07
在C++中有两种类型的赋值运算符:一类是“+=”和“-=”等先计算后赋值的运算符,另一类是“=”即直接赋值的运算符。下面分别进行讨论。
1.重载赋值运算符“+=”和“-=”
对于标准数据类型,“+=”和“-=”的作用是将一个数据与另一个数据进行加法或减法运算,然后再将结果回送给赋值号左边的变量中。对它们重载后,使其实现其他相关的功能。
【例4.7】分析以下程序的执行结果。
解:上述程序中,采用友元函数方式实现+=运算符重载,当执行表达式v1+=v2时,将v1和v2作为两个实参传递给该友元函数,修改v1,并将v1作为该表达式的结果。采用成员函数方式实现-=运算符重载,当执行表达式v1-v2(相当于v1.-(v2))时,将v2作为实参传递给该成员函数,执行这个成员函数,生成一个临时对象tmp,将当前对象v1的x值减去v2.x值的结果赋给tmp的x,将当前对象v1的y值减去v2.y值的结果赋给tmp的y,最后返回tmp作为该表达式的结果。程序的执行结果如下:
v1=(6,8)
v2=(3,6)
v3=v1+=v2后,v3=(9,14)
v4=v1-v2后,v4=(3,2)
注意:程序中重载运算符“+=”和“-=”与标准数据类型的“+=”和“-=”不完全相同。调用重载的运算符时,例如v1+=v2,并不改变v1的值,而后者会改变运算符左边变量的值。
2.重载赋值运算符“=”
赋值运算符“=”的原有含义是将赋值号右边表达式的结果复制给赋值号左边的变量,通过运算符“=”的重载将赋值号右边对象的数据成员依次复制到赋值号左边对象的数据成员中。在正常情况下,系统会为每一个类自动生成一个默认的完成上述功能的赋值运算符,当然,这种赋值只限于由一个类类型说明的对象之间赋值。
如果一个类包含指针成员,采用这种默认的按成员赋值,那么当这些成员撤消后,内存的使用将变得不可靠。
假如有一个类SClass,其中有一个指向某个动态分配内存的指针成员p,定义该类的两个实例s1和s2,在执行赋值语句s2=s1(使用默认的赋值运算符)之前,这两个对象内存分配如图4.3(a)所示,其中s1的成员p指向一个内存区。在执行赋值语句s2=s1之后,这两个对象内存分配如图4.3(b)所示,这时只复制了指针而没有复制指针所指向的内存,现在它们都指向同一内存区。当不需要s1和s2对象后,调用析构函数(两次)来撤消同一内存,会产生运行错误。
图4.3 对象内存分配
可以重载运算符“=”来解决这个问题。重载该运算符的成员函数如下:(www.chuimin.cn)
方式1:
方式2:
上述两种方式都是采用成员函数形式来实现“=”运算符的重载,执行s2=s1语句,相当于执行s2.operator=(s1),当前的this指针指向s2对象,在这两个重载运算符成员函数中,先释放p所指的空间,然后让p指向一个长度为strlen(s1.p)+1的字符空间,并将s1.p所指字符串复制到p所指空间中。它们不同的是,方式1的成员函数没有返回值,即直接修改s2的数据成员,方式2的成员函数有一个返回值,return*this;语句就是返回s2对象。
在赋值运算符连用时,如s3=s2=s1,应使用方式2实现“=”运算符重载。
上述运算符重载成员函数中,都把s.p的内容复制到this.p中。这样,在执行s2=s1后,内存分配结果如图4.4所示。
图4.4 对象内存分配
【例4.8】分析以下程序的执行结果。
解:上述程序中,采用方式2实现"="运算符重载,执行s2=s1语句,相当于执行s2.operator=(s1),当前的this指针指向s2对象,最后的return*this;语句就是返回s2对象。程序的执行结果如下:
执行赋值语句之前:
s1*p=first object
s2*p=second object
执行赋值语句之后:
s1*p=first object
s2*p=first object
有关C++程序设计基础教程的文章
解:上述程序与例4.2程序的功能相同,只是在这里重载运算符有一个返回值,因此A++或++B的结果是一个整数值。程序的执行结果如下:n=7n=62.重载单目运算符“->”“->”运算符是成员访问运算符,这种一元运算符只能被重载为成员函数。......
2023-11-07
运算符重载函数的调用格式与普通成员函数的调用格式类似,以双目运算符重载成员函数为例,其调用格式如下:左运算对象双目运算符右运算对象例如:对于前面的Complex,设计如下主函数:其中,“s3=s1+s2;”和“s4=s1-s2;”两个语句就是调用运算符重载函数。该函数执行完毕,释放tmp对象。......
2023-11-07
当重载输出运算符“<<”用于输出时,相当于创建一个插入符函数。“函数体”中给出实现该插入符重载目的的代码。该语句等价于:cout<>”在C++中,“>>”运算符称为提取运算符,对它进行重载的函数称为提取符函数。......
2023-11-07
程序的执行结果如下:v1=(6,8)v2=(3,6)v1+v2=v1-v2=(3,2)2.重载双目运算符为类的友元函数运算符也可以重载为类的友元函数,这样,它就可以自由地访问该类的任何数据成员。假设有一个类A,对于双目运算符op,如果重载运算符op使之能够实现表达式“obj1 op obj2”,其中obj1和obj2均为A类的对象。将例4.5的类Vector中重载运算符改为友元函数实现。......
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
相关推荐