




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第十三章第十三章 运算符重载运算符重载函数的重载函数的重载所谓函数的重载是指完成不同功能的函数可以具所谓函数的重载是指完成不同功能的函数可以具有有相同的函数名相同的函数名。 C+的编译器是根据的编译器是根据函数的实参函数的实参来确定应该调用来确定应该调用哪一个函数的。哪一个函数的。 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)endl;825 1、定义的重载函数必须具有定义的重载函数必须具有不同的参数个数不同的参数个数,或或不同
2、的参数类型不同的参数类型。只有这样编译系统才有可能。只有这样编译系统才有可能根据不同的参数去调用不同的重载函数。根据不同的参数去调用不同的重载函数。2、仅返回值不同时,不能定义为重载函数。、仅返回值不同时,不能定义为重载函数。 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+y; char str4, c12=a, c22=b;(char *)=(char *) + (char *)str=c1+c2; 编译系统中的运算符编译系统中的运算符“”本
3、身不能做这种运算,本身不能做这种运算,若使上式可以运算,必须重新定义若使上式可以运算,必须重新定义“”运算符,运算符,这种重新定义的过程成为运算符的重载。这种重新定义的过程成为运算符的重载。系统自动识别系统自动识别数据类型数据类型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), c; c=a+b;两对象不能使用,必须重新定义两对象不能使用,必须重新定义运算符重载就是赋予已有的运算符多重运算符重载就是赋予已有的运算符多重含义含义。C+通过重新定义运算符,使它通
4、过重新定义运算符,使它能够用于特定类的对象执行特定的功能能够用于特定类的对象执行特定的功能运算符的重载从另一个方面体现了运算符的重载从另一个方面体现了OOP技术的多技术的多态性,态性,且同一运算符根据不同的运算对象可以完且同一运算符根据不同的运算对象可以完成不同的操作。成不同的操作。 为了重载运算符,必须定义一个函数,并告为了重载运算符,必须定义一个函数,并告诉编译器,诉编译器,遇到这个重载运算符就调用该函数,遇到这个重载运算符就调用该函数,由这个函数来完成该运算符应该完成的操作。由这个函数来完成该运算符应该完成的操作。这这种函数称为运算符重载函数,它通常是种函数称为运算符重载函数,它通常是类
5、的成员类的成员函数或者是友元函数函数或者是友元函数。运算符的操作数通常也应运算符的操作数通常也应该是类的对象。该是类的对象。重载为类的重载为类的成员函数成员函数格式如下:格式如下: operator()函数体函数体A operator + (A &);/重载了类重载了类A的的“+”运算符运算符其中:其中:operator是定义运算符重载函数的关键字,是定义运算符重载函数的关键字,它与其后的运算符一起构成函数名。它与其后的运算符一起构成函数名。返回类型返回类型运算的对象运算的对象关键字关键字函数名函数名运算的对象运算的对象class Aint i;public:A(int a=0) i=
6、a;void Show(void)couti=iendl;void AddA(A &a,A &b)/利用函数进行类之间的运算利用函数进行类之间的运算i=a.i+b.i;void main(void)A a1(10),a2(20),a3;a1.Show ();a2.Show ();/a3=a1+a2;/不可直接运算不可直接运算a3.AddA(a1,a2);/调用专门的功能函数调用专门的功能函数a3.Show ();没有重载运算符的例子没有重载运算符的例子利用函数完成了加法运算利用函数完成了加法运算用和作对象调用函数用和作对象调用函数class Aint i;public:A(in
7、t a=0) i=a;void Show(void)couti=iendl;void AddA(A &a, A &b) /利用函数进行类之间的运算利用函数进行类之间的运算i=a.i+b.i;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);/调用专门的功能函数调用专门的功能函数a3.
8、Show ();相当于相当于a3=a1.operator+(a2)重载运算符与一般函数的比较:重载运算符与一般函数的比较:相同:相同:1)均为类的成员函数;)均为类的成员函数;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);返回值返回值函数名函数名形参列表形参列表由对象由对象a3调用调用函数调用:函数调用:返回值返回值函数名函数名形参形参函数调用:函数调用:a3=a1.operator+(a
9、2);由对象由对象a1调用调用A operator +(A &a) A t; t.i=i+a.i; return t;a3=a1+a2;返回值返回值函数名函数名形参形参函数调用:函数调用:a3=a1.operator+(a2);由对象由对象a1调用调用总结:总结:重新定义运算符,重新定义运算符,由左由左操作符调用右操作符操作符调用右操作符。最后将函数返回值赋给最后将函数返回值赋给运算结果的对象。运算结果的对象。class Aint i;public:A(int a=0) i=a;void Show(void)couti=iendl;void AddA(A &a, A &
10、b) /利用函数进行类之间的运算利用函数进行类之间的运算i=a.i+b.i;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);/调用专门的功能函数调用专门的功能函数a3.Show ();相当于相当于a3=a1.operator+(a2)当用当用成员函数实现运算符的重载时成员函数实现运算符的重载时,运
11、算符,运算符重载函数的参数只能有二种情况:重载函数的参数只能有二种情况:没有参数没有参数或带有一个参数或带有一个参数。对于只有一个操作数的运对于只有一个操作数的运算符算符(如如+),在重载这种运算符时,通常不,在重载这种运算符时,通常不能有参数;而对于有二个操作数的运算符,能有参数;而对于有二个操作数的运算符,只能带有一个参数。只能带有一个参数。这参数可以是对象,对这参数可以是对象,对象的引用,或其它类型的参数。在象的引用,或其它类型的参数。在C+中不中不允许重载有三个操作数的运算符允许重载有三个操作数的运算符2、在、在C+中中,允许重载的运算符列于允许重载的运算符列于表表13.1中。中。3、
12、在、在C+中不允许重载的运算符列于中不允许重载的运算符列于表表13.2。4、只能对只能对C+中已定义了的运算符进行重载,中已定义了的运算符进行重载,而且,当重载一个运算符时,而且,当重载一个运算符时,该运算符的优该运算符的优先级和结合律是不能改变的先级和结合律是不能改变的。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)coutAr
13、ea=Length*Wideendl; room operator+(room &);/重载运算符重载运算符+,函数原型,函数原型;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;
14、r4.Show ();r4=r1+r2+r3;(r1+r2); (r1+r2)+r3;r4=r1+(r2+r3);(r2+r3);r1+(r2+r3);运算符的优先级和结运算符的优先级和结合律是不能改变的合律是不能改变的class Aint i;public:A(int a=0) i=a;void Show(void)couti=iendl;A operator +(A &a)/重载运算符重载运算符+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
15、.Show ();a2.Show ();a3=a1+a2;a1+=a2;a3.Show ();由左操作符调用右操由左操作符调用右操作符作符,没有返回值,没有返回值,故函数类型为故函数类型为void。相当于相当于a3=a1.operator+(a2)相当于相当于a1.operator+=(a2)单目运算符的重载单目运算符的重载只具有一个操作数的运算符为单目运算符,最常只具有一个操作数的运算符为单目运算符,最常用的为及。用的为及。A a, b;b=+a;b=a+;A a;+a;a+;可以看出,虽然运算后对象可以看出,虽然运算后对象a a的值一致,但先自加的值一致,但先自加或后自加的或后自加的重载运
16、算符函数的返回值不一致,重载运算符函数的返回值不一致,必必须在重载时予以区分须在重载时予以区分。+为前置运算时,为前置运算时,它的运算符重载函数的一般格式为:它的运算符重载函数的一般格式为: operator +( ) operator +( ) . .; +为后置运算时为后置运算时,它的运算符重载函数的一般格式为:,它的运算符重载函数的一般格式为: operator +( operator +(intint) ) . .; A a, b;b=+a;b=a+;A operator +( ) . A operator +(int) . class A float x, y;public: A(f
17、loat 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+;A operator +( ) A t; t.x=+ x; t.y=+y; return t; b=+a; b=a.operator+( );返回值返回值函数名函数名at3344t作为函数值返回赋给作为函数值返回赋给bA operator +( ) + x; +y;
18、return *this;将对象本身作为函将对象本身作为函数值返回赋给数值返回赋给bA operator +(int) A t; t.x=x+; t.y=y+; return t;b=a+; b=a.operator+(3);at3243返回值返回值函数名函数名t作为函数值返回赋给作为函数值返回赋给bclass 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
19、, b)friend A operator + (A &a, A &b).class Aint i;public:public:A(int a=0) i=a;void Show(void) couti=iendl; friend A operator +(A &,A &);/友元函数,两个参数,为引用友元函数,两个参数,为引用;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=a
20、1+a2;/重新解释了加法,可以直接进行类的运算重新解释了加法,可以直接进行类的运算a3.Show ();相当于相当于a3=operator+(a1,a2)+为前置运算时,为前置运算时,它的运算符重载函数的一般格式为:它的运算符重载函数的一般格式为:A operator +(A &a)A operator +(A &a) . .; +为后置运算时为后置运算时,它的运算符重载函数的一般格式为:,它的运算符重载函数的一般格式为:A operator +(A &a, A operator +(A &a, intint) ) . .; A a, b;b=+a;b=a+;
21、A operator +( A a ) . A operator +(A a, int) . class Aint i;public:public:A(int a=0) i=a;void Show(void) couti=iendl;friend A operator+(A &a) a.i+; retrurn a;friend A operator+(A &a, int n) A t;t.i=a.i; a.i+; return t; ;void main(void)A a1(10),a2,a3;a2=+a1;a3=a1+;a2.Show();a3.Show ();相当于相当于a
22、2=operator+(a1)相当于相当于a3=operator+(a1,int)class incountint c1,c2;public: incount(int a=0,int b=0) c1=a; c2=b; void Show(void)coutc1=c1tc2=c2endl; friend incount operator +(incount &);/前置前置 friend incount operator +(incount &,int);/后置后置;incount operator+(incount &c)c.c1+;c.c2+;return c;inc
23、ount operator +(incount &c,int)incount cc;cc=c;c.c1+;c.c2+;return cc;void main(void)incount ic1(10,20),ic2(100,200), ic3 , ic4;ic1.Show ();ic2.Show ();ic3=+ic1;/ic3=operator(ic1)ic4=ic2+;/ic4=operator(ic2,n)ic3.Show ();ic4.Show ();class ThreeDfloat x,y,z;public: ThreeD(float a=0,float b=0, float
24、 c=0)x=a;y=b;z=c;friend ThreeD & operator +(ThreeD &);/前置前置friend ThreeD operator +(ThreeD & ,int);/后置后置void Show()cout x=xty=ytz=zn;ThreeD & operator +(ThreeD & t)t.x+;t.y+;t.z+;return t;ThreeD operator +(ThreeD &t ,int )ThreeD temp=t;t.x+;t.y+;t.z+;return temp;void main(voi
25、d )ThreeD m1(25,50, 100),m2(1,2,3),m3;m1.Show();m3=+m1;m1.Show();m3.Show();m3=m2+;m2.Show();m3.Show(); 对双目运算符,重载为成员函数时,仅一个对双目运算符,重载为成员函数时,仅一个参数,另一个被隐含;重载为友元函数时,有两参数,另一个被隐含;重载为友元函数时,有两个参数,没有隐含参数。个参数,没有隐含参数。 一般来说,单目运算符最好被重载为成员一般来说,单目运算符最好被重载为成员函数;对双目运算符最好被重载友元函数。函数;对双目运算符最好被重载友元函数。转换函数转换函数转换函数就是在类中定义一
26、个成员函数,其作用转换函数就是在类中定义一个成员函数,其作用是是将类转换为某种数据类型将类转换为某种数据类型。class A float x, y; public: A(float a, float b) x=a; y=b; ;void main(void) A a(2,3); coutaendl;错误!类的对象不能直接输出错误!类的对象不能直接输出利用转换函数将利用转换函数将类类A的对象的对象a转换转换成某种数据类型成某种数据类型AfloatA : operator float ( ) return x+y; Afloat格式为:格式为:ClassName : operator ( ).类名
27、类名具体的转换算法具体的转换算法欲转换类型欲转换类型关键字关键字转换算法自己定义转换算法自己定义1. 转换函数必须是转换函数必须是类的成员函数。类的成员函数。2. 转换函数的调用是转换函数的调用是隐含的,没有参数。隐含的,没有参数。class Aint i;public:public:A(int a=0) i=a;void Show(void)couti=iendl;operator int( ) returni;void main(void)A a1(10),a2(20);couta1endl;couta2endl;class Complexfloat Real,Image;public:
28、Complex(float real=0,float image=0)Real=real;Image=image; void Show(void) coutReal=RealtImage=Imagefloat;Complex:operator float ()return Real*Real+Image*Image;void main(void)Complex c(10,20);c.Show ();coutcendl;/可以直接输出可以直接输出c,因为已经进行类型转换,因为已经进行类型转换注意,注意,转换函数只能是成员函数,不能是友转换函数只能是成员函数,不能是友元函数。元函数。转换函数的操作
29、数是对象转换函数的操作数是对象。转换函。转换函数可以被派生类继承,也可以被说明为虚函数可以被派生类继承,也可以被说明为虚函数。数。赋值运算符与赋值运算符重载赋值运算符与赋值运算符重载 “”同类型的对象间可以相互赋值,等同于对象的各同类型的对象间可以相互赋值,等同于对象的各个成员的一一赋值。个成员的一一赋值。A a(2,3), b;A a(2,3), b;b ba;a; 但当对象的成员中使用了动态的数据类型时但当对象的成员中使用了动态的数据类型时(用用new开辟空间),就不能直接相互赋值,否则在程开辟空间),就不能直接相互赋值,否则在程序的执行期间会出现运行错误序的执行期间会出现运行错误。cla
30、ss Achar *ps;public:A( ) ps=0;A(char *s )ps =new char strlen(s)+1; strcpy(ps,s);A( ) if (ps) delete ps;void Show(void) coutpsendl;void main(void ) A s1(China!),s2(Computer!); s1.Show(); s2.Show(); s2=s1; s1.Show(); s2.Show();/相当于相当于 s2.ps=s1.ps;s1ps“China”s2psComputers2.ps=s1.ps首先析构首先析构s2接着析构接着析构s1出
31、错出错这时,利用编译系统的默认赋值无法正确运行程这时,利用编译系统的默认赋值无法正确运行程序,必须重载赋值运算符序,必须重载赋值运算符“”,即,即重新定义重新定义“”。格式为:格式为: :operator=()赋值运算符必须重载为成员函数。赋值运算符必须重载为成员函数。A A: operator = (A &a)函数返回值类型函数返回值类型成员函数作用域成员函数作用域函数名函数名函数参数函数参数b=a;b.operator=(a);左操作符调左操作符调用右操作符用右操作符class Sampleint x;public: Sample(int i=0)x=i;void disp(voi
32、d) cout“x=“xendl;void operator=(Sample &p) x=p.x; ;void main(void) Sample A(20),B; Sample C(A);/使用缺省的拷贝构造函数使用缺省的拷贝构造函数 B=A; /使用赋值运算符重载使用赋值运算符重载 B.disp(); A.disp();class Achar *ps;public:A( ) ps=0;A(char *s )ps =new char strlen(s)+1; strcpy(ps,s);A( ) if (ps) delete ps;void Show(void) coutpsendl;
33、A& operator=(A &b);void main(void ) A s1(China!),s2(Computer!); s1.Show(); s2.Show(); s2=s1; s1.Show(); s2.Show();必须重新定义必须重新定义“=”A &A:operator = ( A &b)/重载赋值运算符重载赋值运算符 if ( ps ) delete ps; if ( b.ps) ps = new char strlen(b.ps)+1;strcpy( ps, b.ps); else ps =0; return *this;s1ps“China”
34、s2ps“Computer”s2=s1;s2.operator=(s1);“China”返回同种类型的引用适合于连等。返回同种类型的引用适合于连等。s3=s2=s1;class Achar *ps;public: A( ) ps=0;A(char *s )ps =new char strlen(s)+1;strcpy(ps,s);A( ) if (ps) delete ps;char *GetS( ) return ps;A & operator = ( A &b);/重载赋值运算符重载赋值运算符;A &A:operator = ( A &b)/重载赋值运算符重
35、载赋值运算符 if ( ps ) delete ps; if ( b.ps) ps = new char strlen(b.ps)+1;strcpy( ps, b.ps); else ps =0; return *this;void main(void )A s1(China!),s2(Computer!);s2=s1;cout s1= s1.GetS()t;cout s2= s2.GetS()n;s2.ps重新开辟内存,存放重新开辟内存,存放“China”重新开辟内存重新开辟内存一个字符串类一个字符串类在在C+中,系统提供的字符串处理能力比较中,系统提供的字符串处理能力比较弱,都是通过字符处理函数来实现的,并且弱,都是通过字符处理函数来实现的,并且不能直接对字符串进行加法、减法,字符串不能直接对字符串进行加法、减法,字符串的拼接,字符串之间的相互赋值等操作的拼接,字符串之间的相互赋值等操作。可。可以通过应用以通过应用C+提供的运算符重载机制,可提供的运算符重载机制,可以提供字符串的直接操作能力,使得字符串以提供字符串的直接操作能力,使得字符串的操作与一般的数据一样方便。的操作与一般的数据一样方便。class String int Length;/字符串长度字符串长度 char *Sp; /
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年甘肃陇南金徽酒股份有限公司招聘199人笔试参考题库附带答案详解
- 育肥猪饲料知识培训课件
- 2025年中国铁道出版社有限公司招聘(14人)笔试参考题库附带答案详解
- 2025山西太原西山生态文旅投资建设有限公司及子公司招聘13人笔试参考题库附带答案详解
- 2025中国冶金地质总局所属在京单位高校毕业生招聘23人笔试参考题库附带答案详解
- 新编大学英语(第四版)综合教程B4U6(浙江海洋大学版)课件 B4U6 Journeys in medicine Further development
- 2025年上半年六安市霍邱县人民法院招考易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年保定市高阳县招考政法机关辅助工作人员易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年佛山市南海区里水镇政府和村事业单位招43人易考易错模拟试题(共500题)试卷后附参考答案
- 2025年上半年亳州市属事业单位招考及易考易错模拟试题(共500题)试卷后附参考答案
- 森林专业扑火队培训课件
- 学校体育学第八章课余体育锻炼课件
- “一带一路”视域下印度尼西亚中资企业所得税返还案例解析
- 职业健康监护评价报告编制指南
- 管理ABC-干嘉伟(美团网COO)
- 社会工作综合能力初级讲义课件
- 儿童流感的防治和预防措施
- 工业旅游策划案例
- 智能制造企业制造成熟度能力域打分表
- 《员工保密协议书》电子版正规范本(通用版)
- 城市灾害学课件-地质灾害(1)课件
评论
0/150
提交评论