《运算符重载》PPT课件.ppt





《《运算符重载》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《运算符重载》PPT课件.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、程序设计 cs.sjtu 2011.9程序设计-1第第11章章运算符重载运算符重载v什么是运算符重载什么是运算符重载v运算符重载的方法运算符重载的方法v几个特殊的运算符的重载几个特殊的运算符的重载v自定义类型转换运算符自定义类型转换运算符v运算符重载实例运算符重载实例程序设计 cs.sjtu 2011.9程序设计-2什么是运算符重载什么是运算符重载v使系统内置的运算符可以用于类类型使系统内置的运算符可以用于类类型v例如:例如:+运算符能够实现运算符能够实现2 2个对象间的加。个对象间的加。例如:类例如:类A A的对象的对象a1a1、a2a2、a3a3,希望:,希望:a3=a1+a2a3=a1+
2、a2;即即:分分别别把把对对象象a1a1和和a2a2的的各各个个数数据据成成员员值对应相加,然后赋给对象值对应相加,然后赋给对象a3a3。程序设计 cs.sjtu 2011.9程序设计-3问题的提出问题的提出v把把某某些些事事交交给给系系统统去去做做,用用户户只只要要知知道道相加就可相加就可v扩充运算符的功能扩充运算符的功能v增强了增强了C+C+语言的可扩充性语言的可扩充性v使用户定义的类更像系统的内置类型使用户定义的类更像系统的内置类型程序设计 cs.sjtu 2011.9程序设计-4运算符重载的限制运算符重载的限制v不是所有的运算符都能重载不是所有的运算符都能重载v重载不能改变运算符的优先
3、级和结合性重载不能改变运算符的优先级和结合性v重载不能改变运算符的操作数个数重载不能改变运算符的操作数个数v不能创建新的运算符不能创建新的运算符程序设计 cs.sjtu 2011.9程序设计-5可以重载的运算符可以重载的运算符+-*/%&|!=+=-=*=/=%=&=|=!=&|+-*,-()newdeletenewdelete程序设计 cs.sjtu 2011.9程序设计-6不能重载的运算符不能重载的运算符.*:?:sizeof程序设计 cs.sjtu 2011.9程序设计-7第第11章章运算符重载运算符重载v什么是运算符重载什么是运算符重载v运算符重载的方法运算符重载的方法v几个特殊的运算
4、符的重载几个特殊的运算符的重载v自定义类型转换运算符自定义类型转换运算符v运算符重载实例运算符重载实例程序设计 cs.sjtu 2011.9程序设计-8运算符重载的方法运算符重载的方法v运算符重载就是写一个函数解释某个运算符在运算符重载就是写一个函数解释某个运算符在某个类中的含义某个类中的含义v要使得系统能自动找到重载的这个函数,函数要使得系统能自动找到重载的这个函数,函数名必须要体现出和某个被重载的运算符的联系。名必须要体现出和某个被重载的运算符的联系。vC+中规定,重载函数名为中规定,重载函数名为operator其中,其中,为要重载的运算符。如要重载为要重载的运算符。如要重载“+”运算符,
5、该重载函数名为运算符,该重载函数名为operator+。要重载。要重载赋值运算符,函数名为赋值运算符,函数名为operator=。程序设计 cs.sjtu 2011.9程序设计-9函数原型v运算符的重载不能改变运算符的运算对象数。因此,重载运算符的重载不能改变运算符的运算对象数。因此,重载函数的形式参数个数(包括成员函数的隐式指针函数的形式参数个数(包括成员函数的隐式指针this)与运)与运算符的运算对象数相同算符的运算对象数相同v运算符重载可以重载成成员函数也可以重载成全局函数实运算符重载可以重载成成员函数也可以重载成全局函数实现。重载成全局函数时,最好把此函数设为友员函数现。重载成全局函数
6、时,最好把此函数设为友员函数v如果作为类的成员函数,它的形式参数个数比运算符的运如果作为类的成员函数,它的形式参数个数比运算符的运算对象数少算对象数少1。这是因为成员函数有一个隐含的参数。这是因为成员函数有一个隐含的参数this。在在C+中,把隐含参数中,把隐含参数this作为运算符的第一个参数。作为运算符的第一个参数。v当把一个一元运算符重载成成员函数时,该函数没有形式当把一个一元运算符重载成成员函数时,该函数没有形式参数。参数。v把一个二元运算符重载成成员函数时,该函数只有一个形把一个二元运算符重载成成员函数时,该函数只有一个形式参数,就是右操作数,当前对象是左操作数。式参数,就是右操作数
7、,当前对象是左操作数。程序设计 cs.sjtu 2011.9程序设计-10重载实例重载实例v为为rational类增加类增加“+”和和“*”以及比较以及比较的重载函数,用以替换现有的的重载函数,用以替换现有的add和和multi函数函数程序设计 cs.sjtu 2011.9程序设计-11方案一:重载成成员函数方案一:重载成成员函数classRationalprivate:intnum;intden;voidReductFraction();public:Rational(intn=0,intd=1)num=n;den=d;Rationaloperator+(constRational&r1)c
8、onst;Rationaloperator*(constRational&r1)const;booloperator(constRational&r1)const;booloperator=(constRational&r1)const;booloperator!=(constRational&r1)const;voiddisplay()coutnum/den;程序设计 cs.sjtu 2011.9程序设计-12函数实现函数实现RationalRational:operator+(constRational&r1)constRationaltmp;tmp.num=num*r1.den+r1.n
9、um*den;tmp.den=den*r1.den;tmp.ReductFraction();returntmp;RationalRational:operator*(constRational&r1)constRationaltmp;tmp.num=num*r1.num;tmp.den=den*r1.den;tmp.ReductFraction();returntmp;程序设计 cs.sjtu 2011.9程序设计-13boolRational:operator(constRational&r1)constreturnnum*r1.den(constRational&r1)constretu
10、rnnum*r1.denden*r1.num;boolRational:operator=(constRational&r1)constreturnnum*r1.den=(constRational&r1)constreturnnum*r1.den=den*r1.num;boolRational:operator!=(constRational&r1)constreturn!(*this=r1);程序设计 cs.sjtu 2011.9程序设计-14方案二:重载成友员函数方案二:重载成友员函数classRationalfriendRationaloperator+(constRational&r
11、1,constRational&r2);friendRationaloperator*(constRational&r1,constRational&r2);friendbooloperator(constRational&r1,constRational&r2);friendbooloperator=(constRational&r1,constRational&r2);friendbooloperator!=(constRational&r1,constRational&r2);private:intnum;intden;voidReductFraction();public:Ration
12、al(intn=0,intd=1)num=n;den=d;voiddisplay()coutnum/den;程序设计 cs.sjtu 2011.9程序设计-15函数的实现函数的实现Rationaloperator+(constRational&r1,constRational&r2)Rationaltmp;tmp.num=r1.num*r2.den+r2.num*r1.den;tmp.den=r1.den*r2.den;tmp.ReductFraction();returntmp;Rationaloperator*(constRational&r1,constRational&r2)Ratio
13、naltmp;tmp.num=r1.num*r2.num;tmp.den=r1.den*r2.den;tmp.ReductFraction();returntmp;其他函数实现略其他函数实现略程序设计 cs.sjtu 2011.9程序设计-16重载后有理数类的使用重载后有理数类的使用intmain()Rationalr1(1,6),r2(1,6),r3;r3=r1+r2;r1.display();cout+;r2.display();cout=;r3.display();coutendl;r3=r1*r2;r1.display();cout*;r2.display();cout=;r3.dis
14、play();cout)必须重载成成员函数。)必须重载成成员函数。v具有赋值意义的运算符,如复合的赋值运算符以及具有赋值意义的运算符,如复合的赋值运算符以及+和和-,不一定非要定义为成员函数,但最好定义为成员函数。,不一定非要定义为成员函数,但最好定义为成员函数。v具有两个运算对象的运算符最好重载为全局函数,这样可具有两个运算对象的运算符最好重载为全局函数,这样可以使得应用更加灵活。如果把加运算定义成全局函数,以使得应用更加灵活。如果把加运算定义成全局函数,r是有理数类的对象,则是有理数类的对象,则2+r是一个合法的表达式。是一个合法的表达式。程序设计 cs.sjtu 2011.9程序设计-1
15、8第第11章章运算符重载运算符重载v什么是运算符重载什么是运算符重载v运算符重载的方法运算符重载的方法v几个特殊的运算符的重载几个特殊的运算符的重载v自定义类型转换运算符自定义类型转换运算符v运算符重载实例运算符重载实例程序设计 cs.sjtu 2011.9程序设计-19几个特殊的运算符的重载几个特殊的运算符的重载v赋值运算符赋值运算符v下标运算符下标运算符v函数调用运算符函数调用运算符v+和和运算符的重载运算符的重载v重载函数的原型设计考虑重载函数的原型设计考虑v输入输出运算符重载输入输出运算符重载程序设计 cs.sjtu 2011.9程序设计-20赋值运算符赋值运算符v对任一类,如果用户没
16、有自定义赋值运算对任一类,如果用户没有自定义赋值运算符函数,那么系统为其生成一个缺省的赋符函数,那么系统为其生成一个缺省的赋值运算符函数,在对应的数据成员间赋值。值运算符函数,在对应的数据成员间赋值。v一般情况下,这个缺省的赋值运算符重载一般情况下,这个缺省的赋值运算符重载函数能满足用户的需求。但是,当类含有函数能满足用户的需求。但是,当类含有类型为指针的数据成员时,可能会带来一类型为指针的数据成员时,可能会带来一些麻烦。些麻烦。程序设计 cs.sjtu 2011.9程序设计-21对对DoubleArray类对象执行类对象执行array1=array2的问题的问题v会引起内存泄漏会引起内存泄漏
17、v使这两个数组的元素存放于同一块空间中使这两个数组的元素存放于同一块空间中v当这两个对象析构时,先析构的对象会释当这两个对象析构时,先析构的对象会释放存储数组元素的空间。而当后一个对象放存储数组元素的空间。而当后一个对象析构时,无法释放存放数组元素的空间析构时,无法释放存放数组元素的空间程序设计 cs.sjtu 2011.9程序设计-22赋值运算符“=”的原型v赋值运算符只能重载成成员函数赋值运算符只能重载成成员函数v函数原型:函数原型:X&X:operator=(constX&source)/赋值过程赋值过程一旦创建了对象一旦创建了对象x1,x2,可以用可以用x1=x2赋值。赋值。程序设计
18、cs.sjtu 2011.9程序设计-23DoubleArray类的类的赋值运算符重载函数赋值运算符重载函数DoubleArray&DoubleArray:operator=(constDoubleArray&right)if(this=&right)return*this;deletestorage;low=right.low;high=right.high;storage=newdoublehigh-low+1;for(inti=0;i=high-low;+i)storagei=right.storagei;/复制数组元素复制数组元素return*this;程序设计 cs.sjtu 201
19、1.9程序设计-24赋值运算符重载要点赋值运算符重载要点v一般来讲,需要自定义拷贝构造函数的类也需要一般来讲,需要自定义拷贝构造函数的类也需要自定义赋值运算符重载函数。自定义赋值运算符重载函数。v在赋值运算符重载函数中,已经将参数的值赋值在赋值运算符重载函数中,已经将参数的值赋值给了当前对象,那为什么还需要返回值呢?记住,给了当前对象,那为什么还需要返回值呢?记住,在在C+中,赋值是一个运算,它可以形成一个表中,赋值是一个运算,它可以形成一个表达式,而该表达式的结果值就是赋给左边的对象达式,而该表达式的结果值就是赋给左边的对象的值。因此,赋值运算符重载函数必须返回赋给的值。因此,赋值运算符重载
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算符重载 运算 重载 PPT 课件

限制150内