对任何一个类,如果用户不定义自己的赋值运算符函数,那么编译器会自动为其生成一个默认的赋值运算符重载函数,用以完成对应数据成员间赋值。该默认赋值运算符重载函数在处理对象间的赋值时,把一个对象的数据成员按字节地复制给要赋值对象对应的数据成员。当类含有类型为指针的数据成员时,使用默认赋值运算符重载函数有时可能会出现程序不能正确运行的情况,那么我们如何重载赋值运算符使带有指针的数据成员的对象间也能成功赋值呢?
默认赋值运算符重载函数一般情况下能满足用户的需求。例如:
Complex c1(3,5),c2;
c2=c1;
上面语句表示将c1的数据成员逐个赋给c2的对应的数据成员,即:
c2.real=c1.real;
c2.image=c1.image;
但是,对于含有类型为指针的数据成员时,此时使用默认赋值运算符重载函数有时不能完成两个对象间的正确赋值,这时需要根据需要对赋值运算符进行重载。
赋值运算符“=”是双目运算符,重载赋值运算符时必须以类的成员函数进行重载,不能以非成员函数重载。
【例6.7】重载赋值运算符,实现MyString类对象的赋值。
从例6.7中重载赋值运算符函数可以看出,对于一个完整的赋值运算符重载需要按以下步骤进行:
(1)检查自赋值。避免间接的自赋值出现的可能性,如果出现自赋值不理并导致对象复制自己,则在第二步的delete语句,对象被“自杀”了。所以,如果发现自赋值,应该马上终止函数。注意不要将检查自赋值的if语句,if(this==&other)错写成为if(∗this==other)
(2)用delete释放原有的内存资源。如果此时不进行释放,将造成内存泄漏。
(3)分配新的内存资源,并复制字符串。注意函数strlen返回的是有效字符串长度,不包含结束符‘\0’。函数strcpy则连‘\0’一起复制。
(4)返回本对象的引用,是为了实现像a=b=c这样的链式表达。注意不要将return∗this错写成return this。也不要写成return other,因为我们不知道参数other的生命期。有可能other是个临时对象,在赋值结束后它马上消失,那么return other返回的将是无用的信息。
综合实训
运算符重载
【实训目的】
1.理解运算符重载的方法。
2.灵活运用运算符重载。
【实训内容】
定义整数集合类intSet,实现如下功能:
定义类的构造函数,并根据需要可以定义多个构造函数。
Clear函数:清空整数集合
IsEmpty():整数集合是否空集
operator+:增加一个整数到整数集合中
operator-:从整数集合中删除一个整数元素
operator=:整数集合的对象之间的赋值
提示:一是一个整数集合中不允许有相同元素存在,二是集合中的元素没有顺序。类intSet可以用数组的方式定义整数集合。例如:
int element[200]:保存整数集合数据(www.daowen.com)
int Element Num:指示整数集合的最后一个元素位置
【实训设计】
参考代码:
项目小结
本项目深入讨论了C++语言中运算符重载的方法。通过对运算符的重载,使得用户自定义的数据类型能够使用C++语言中提供的丰富的运算符。
课后练习
一、选择题
1.下列关于运算符重载的描述中,正确的是( )。
A.运算符重载可以改变运算符的操作数个数 B.运算符重载可以改变优先级
C.运算符重载可以改变结合性 D.运算符重载不能改变语法结构
2.下列运算符中,在C++中不能重载的是( )。
A.& B.[] C.::D.new
3.下列运算符不能重载为友元函数的是( )。
A.+ B.= C.∗ D.> >
4.下列函数中,不能重载的是( )。
A.成员函数 B.非成员函数
C.析构函数 D.构造函数
二、编程题
1.设计一个点类point,表示平面坐标中的一个点实现点对象之间的各种运算。
bool operator==(point) //运算符重载,判断两个对象是否相同
bool operator! =(point) //运算符重载,判断两个对象是否不相同
bool operator+(point) //运算符重载,将两个点对象相加
bool operator-(point) //运算符重载,将两个点对象相减
2.有两个矩阵A 和B,均为2行3列。求两个矩阵的和。重载运算符“+”,使之能用于矩阵相加。例如,C=A+B。
3.设计一个日期类Data,包括年、月、日等私有成员。编程实现日期的基本运算,通过分别重载“++”“--”运算符计算某日期自增一天或自减一个的日期。
资源推荐
1.C++网站 http://www.cplusplus.com
2.C++类库参考 https://msdn.microsoft.com/zh-cn/library/cscc687y.aspx
3.百度传课 http://www.chuanke.com/course/72351176561000448_______2.html
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。