C++_面向对象程序设计_谭浩强第十三章.pptx
《C++_面向对象程序设计_谭浩强第十三章.pptx》由会员分享,可在线阅读,更多相关《C++_面向对象程序设计_谭浩强第十三章.pptx(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、会计学1C+_面向对象程序设计面向对象程序设计(chn x sh j)_谭浩强谭浩强 第十三章第十三章第一页,共49页。函数函数(hnsh)的重载的重载所谓函数的重载是指完成不同功能的函数可以所谓函数的重载是指完成不同功能的函数可以(ky)具有相同的函数名。具有相同的函数名。C+的编译器是根据函数的实参来确定应该调用的编译器是根据函数的实参来确定应该调用(dioyng)哪一个函数的。哪一个函数的。int fun(int a,int b)return a+b;int fun(int a)return a*a;void main(void)coutfun(3,5)endl;coutfun(5)en
2、dl;825第1页/共49页第二页,共49页。1、定定义义的的重重载载函函数数必必须须具具有有不不同同的的参参数数个个数数,或或不不同同的的参参数数类类型型。只只有有这这样样(zhyng)编编译译系系统统才才有有可可能能根根据据不同的参数去调用不同的重载函数。不同的参数去调用不同的重载函数。2、仅返回值不同时、仅返回值不同时(tngsh),不能定义为重载,不能定义为重载函数。函数。第2页/共49页第三页,共49页。int sum,a=3,b=2;(int)=(int)+(int)sum=a+b;float add,x=3.2,y=2.5;(float)=(float)+(float)add=x
3、+y;char str4,c12=a,c22=b;(char*)=(char*)+(char*)str=c1+c2;编译系统中的运算符编译系统中的运算符“”本身不能做这种运算,若本身不能做这种运算,若使上式可以使上式可以(ky)运算,必须重新定义运算,必须重新定义“”运算符,运算符,这种重新定义的过程成为运算符的重载。这种重新定义的过程成为运算符的重载。系统自动识别数据类型系统自动识别数据类型第3页/共49页第四页,共49页。class A float x,y;public:A(float a=0,float b=0)x=a;y=b;void main(void)A a(2,3),b(3,4)
4、,c;c=a+b;两对象两对象(duxing)不能使用,必须重新不能使用,必须重新定义定义运算符重载就是赋予已有的运算符多重运算符重载就是赋予已有的运算符多重含义。含义。C+通过重新定义运算符,使它通过重新定义运算符,使它能够能够(nnggu)用于特定类的对象执行用于特定类的对象执行特定的功能特定的功能第4页/共49页第五页,共49页。运算符的重载从另一个方面体现了运算符的重载从另一个方面体现了OOP技术技术(jsh)的多态性,且同一运算符根据不同的运算对象可以完的多态性,且同一运算符根据不同的运算对象可以完成不同的操作。成不同的操作。为了重载运算符,必须定义一个函数,并告为了重载运算符,必须
5、定义一个函数,并告诉编译器,遇到这个诉编译器,遇到这个(zh ge)重载运算符就调用重载运算符就调用该函数,由这个该函数,由这个(zh ge)函数来完成该运算符应函数来完成该运算符应该完成的操作。这种函数称为运算符重载函数,该完成的操作。这种函数称为运算符重载函数,它通常是类的成员函数或者是友元函数。运算符它通常是类的成员函数或者是友元函数。运算符的操作数通常也应该是类的对象。的操作数通常也应该是类的对象。第5页/共49页第六页,共49页。重载重载(zhn zi)为类的成员函数为类的成员函数格式如下:格式如下:operator()函数体函数体 A operator+(A&);/重载重载(zhn
6、 zi)了类了类A的的“+”运算符运算符其中:其中:operator是定义运算符重载函数的关键字,是定义运算符重载函数的关键字,它与它与其后的运算符一起构成函数名。其后的运算符一起构成函数名。返回类型返回类型运算的对象运算的对象关键字关键字函数名函数名运算的对象运算的对象第6页/共49页第七页,共49页。class Aint i;public:A(int a=0)i=a;void Show(void)couti=iendl;void AddA(A&a,A&b)/利用利用(lyng)函数进行类之间的运算函数进行类之间的运算i=a.i+b.i;void main(void)A a1(10),a2(
7、20),a3;a1.Show();a2.Show();/a3=a1+a2;/不可直接运算不可直接运算a3.AddA(a1,a2);/调用专门的功能函数调用专门的功能函数a3.Show();没有没有(mi yu)重载运算符的例子重载运算符的例子利用函数完成利用函数完成(wn chng)了加法运算了加法运算用和作对象调用函数用和作对象调用函数第7页/共49页第八页,共49页。class Aint i;public:A(int a=0)i=a;void Show(void)couti=iendl;void AddA(A&a,A&b)/利用函数进行类之间的运算利用函数进行类之间的运算i=a.i+b.i
8、;A operator+(A&a)/重载运算符重载运算符+A t;t.i=i+a.i;return t;void main(void)A a1(10),a2(20),a3;a1.Show();a2.Show();a3=a1+a2;/重新解释了加法,可以直接进行类的运算重新解释了加法,可以直接进行类的运算a3.AddA(a1,a2);/调用调用(dioyng)专门的功能函数专门的功能函数a3.Show();相当于相当于a3=a1.operator+(a2)第8页/共49页第九页,共49页。重载运算符与一般重载运算符与一般(ybn)函数的比较:函数的比较:相同:相同:1)均为类的成员)均为类的成员
9、(chngyun)函数;函数;2)实现同)实现同一功能一功能void AddA(A&a,A&b)i=a.i+b.i;A operator+(A&a)A t;t.i=i+a.i;return t;a3=a1+a2;a3.AddA(a1,a2);返回值返回值函数函数(hnsh)名名形参列表形参列表由对象由对象a3调用调用函数调用:函数调用:返回值返回值函数名函数名形参形参函数调用:函数调用:a3=a1.operator+(a2);由对象由对象a1调用调用第9页/共49页第十页,共49页。A operator+(A&a)A t;t.i=i+a.i;return t;a3=a1+a2;返回值返回值函数
10、函数(hnsh)名名形参形参函数调用:函数调用:a3=a1.operator+(a2);由对象由对象(duxing)a1调调用用总结总结(zngji):重新定义运算符,重新定义运算符,由左由左操作符调用右操作符操作符调用右操作符。最后将函数返回值赋给运最后将函数返回值赋给运算结果的对象。算结果的对象。第10页/共49页第十一页,共49页。class Aint i;public:A(int a=0)i=a;void Show(void)couti=iendl;void AddA(A&a,A&b)/利用函数进行类之间的运算利用函数进行类之间的运算i=a.i+b.i;A operator+(A&a)
11、/重载运算符重载运算符+A t;t.i=i+a.i;return t;void main(void)A a1(10),a2(20),a3;a1.Show();a2.Show();a3=a1+a2;/重新解释了加法,可以直接进行类的运算重新解释了加法,可以直接进行类的运算a3.AddA(a1,a2);/调用专门调用专门(zhunmn)的功能函数的功能函数a3.Show();相当于相当于a3=a1.operator+(a2)第11页/共49页第十二页,共49页。当当用用成成员员函函数数(hnsh)实实现现运运算算符符的的重重载载时时,运运算算符符重重载载函函数数(hnsh)的的参参数数只只能能有有
12、二二种种情情况况:没没有有参参数数或或带带有有一一个个参参数数。对对于于只只有有一一个个操操作作数数的的运运算算符符(如如+),在在重重载载这这种种运运算算符符时时,通通常常不不能能有有参参数数;而而对对于于有有二二个个操操作作数数的的运运算算符符,只只能能带带有有一一个个参参数数。这这参参数数可可以以是是对对象象,对对象象的的引引用用,或或其其它它类类型型的的参参数数。在在C+中中不不允允许许重重载载有有三三个个操操作作数数的的运运算符算符第12页/共49页第十三页,共49页。2、在、在C+中中,允许重载的运算符列于表允许重载的运算符列于表13.1中。中。3、在在C+中中不不允允许许重重载载
13、的的运运算算符符列列于于表表13.2。4、只只能能对对C+中中已已定定义义(dngy)了了的的运运算算符符进进行行重重载载,而而且且,当当重重载载一一个个运运算算符符时时,该该运运算符的优先级和结合律是不能改变的。算符的优先级和结合律是不能改变的。第13页/共49页第十四页,共49页。class roomfloat Length;float Wide;public:room(float a=0.0,float b=0.0)Length=a;Wide=b;void Show(void)coutLength=LengthtWide=Wideendl;void ShowArea(void)coutA
14、rea=Length*Wideendl;room operator+(room&);/重载运算符重载运算符+,函数原型,函数原型(yunxng);room room:operator+(room&r)/重载运算符,函数定义重载运算符,函数定义 room rr;rr.Length=Length+r.Length;rr.Wide=Wide+r.Wide;return rr;void main(void)room r1(3,2),r2(1,4),r3,r4;r1.Show();r2.Show();r3=r1+r2;r3.Show();r4=r1+r2+r3;r4.Show();r4=r1+r2+r3
15、;(r1+r2);(r1+r2)+r3;r4=r1+(r2+r3);(r2+r3);r1+(r2+r3);运算符的优先级和结运算符的优先级和结合律是不能改变合律是不能改变(gibin)的的第14页/共49页第十五页,共49页。class Aint i;public:A(int a=0)i=a;void Show(void)couti=iendl;A operator+(A&a)/重载重载(zhn zi)运算符运算符+A t;t.i=i+a.i;return t;void operator+=(A&a)i=i+a.i;void main(void)A a1(10),a2(20),a3;a1.Sh
16、ow();a2.Show();a3=a1+a2;a1+=a2;a3.Show();由左操作符调用右操作由左操作符调用右操作符,没有符,没有(mi yu)返返回值,故函数类型为回值,故函数类型为void。相当于相当于a3=a1.operator+(a2)相当于相当于a1.operator+=(a2)第15页/共49页第十六页,共49页。单目运算符的重载单目运算符的重载(zhn zi)(zhn zi)只具有只具有(jyu)(jyu)一个操作数的运算符为单目运算符,最一个操作数的运算符为单目运算符,最常用的为及。常用的为及。A a,b;b=+a;b=a+;A a;+a;a+;可以看出,虽然运算后对象
17、可以看出,虽然运算后对象a a的值一致的值一致(yzh)(yzh),但先,但先自加或后自加的重载运算符函数的返回值不一致自加或后自加的重载运算符函数的返回值不一致(yzh)(yzh),必须在重载时予以区分。,必须在重载时予以区分。第16页/共49页第十七页,共49页。+为前置运算时,它的运算符重载函数的一般格式为前置运算时,它的运算符重载函数的一般格式(g shi)(g shi)为:为:operator+()operator+().;+为后置运算时,它的运算符重载函数的一般格式为后置运算时,它的运算符重载函数的一般格式(g shi)(g shi)为:为:operator+(int)operat
18、or+(int).;A a,b;b=+a;b=a+;A operator+().A operator+(int).第17页/共49页第十八页,共49页。class A float x,y;public:A(float a=0,float b=0)x=a;y=b;A operator+()A t;t.x=+x;t.y=+y;return t;A operator+(int)A t;t.x=x+;t.y=y+;return t;void main(void)A a(2,3),b;b=+a;b=a+;第18页/共49页第十九页,共49页。A operator+()A t;t.x=+x;t.y=+y;
19、return t;b=+a;b=a.operator+();返回值返回值函数函数(hnsh)名名23at3344t作为函数作为函数(hnsh)值值返回赋给返回赋给bA operator+()+x;+y;return*this;将对象将对象(duxing)本本身作为函数值返回赋身作为函数值返回赋给给b第19页/共49页第二十页,共49页。A operator+(int)A t;t.x=x+;t.y=y+;return t;b=a+;b=a.operator+(3);23at3243返回值返回值函数函数(hnsh)名名t作为作为(zuwi)函数值返函数值返回赋给回赋给b第20页/共49页第二十一页
20、,共49页。class incountint c1,c2;public:incount(int a=0,int b=0)c1=a;c2=b;void Show(void)coutc1=c1tc2=c2等等格式为:格式为:friend operator().c=a+b;/c=operator+(a,b)friend A operator+(A&a,A&b).第25页/共49页第二十六页,共49页。class Aint i;public:public:A(int a=0)i=a;void Show(void)couti=iendl;friend A operator+(A&,A&);/友元函数友元
21、函数(hnsh),两个参数,为引用,两个参数,为引用;A operator+(A&a,A&b)A t;t.i=a.i+b.i;return t;void main(void)A a1(10),a2(20),a3;a1.Show();a2.Show();a3=a1+a2;/重新解释了加法,可以直接进行类的运算重新解释了加法,可以直接进行类的运算a3.Show();相当于相当于a3=operator+(a1,a2)第26页/共49页第二十七页,共49页。+为为前前置置(qin(qin zh)zh)运运算算时时,它它的的运运算算符符重重载载函函数数的的一一般般格式为:格式为:A operator+(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 谭浩强 第十三
限制150内