C--课件-第十三章-运算符重载_第1页
C--课件-第十三章-运算符重载_第2页
C--课件-第十三章-运算符重载_第3页
C--课件-第十三章-运算符重载_第4页
C--课件-第十三章-运算符重载_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第十三章 运算符重载运算符一种函数;对于类对象,用户可重新定义运算符函数。 class C private: double x; public: C( ) x=0.0; C(double a) x=a; C add(const C m) C temp; temp.x=m.x+x; return temp; ;引子 C a(10), b(3); C c=a.add(b); 希望c=a+b; C a(10), b(3), c; c=a+b; 赋值运算符一般用预定义的a.operator+(b)加法运算符重载函数(利用成员函数重载) class C / public: C operator+(C m

2、) C temp(x+m.x); return temp; / ;/定义方式1. 负号“-” (利用成员函数重载) C C: operator - ( ) C temp; temp.x=-x; return temp; 一.单目运算符重载 C c=-a; a.operator-( )1. 负号“-” (利用友元函数重载) class C / public: friend C operator-(const C); / ; C operator- (const C m ) C temp; temp.x=-m.x; return temp; C c=-a; operator-(a) 单目运算符重载

3、中成员函数重载与友元函数重载之间的区别: 用成员函数重载单目运算符,由于此时运算符的操作数为当前对象,因此用成员函数重载单目运算符时无参数。 由于友元函数非成员函数,不能使用this指针,因此用友元函数重载单目运算符时必须带有一个参数作为该运算符的操作数。2. 前置运算符+ (利用成员函数重载) class C private: double x; public: C( ) x=0.0; C(double a) x=a; C operator+() x+; return *this; ;C A(1);+A;2. 前置运算符+ (利用友元函数重载) class C private: double

4、 x; public: C( ) x=0.0; C(double a) x=a; friend C operator+(C &); ; C operator+(C &t) t.x+; return t; C A(1);+A; 对于要改变操作数的运算符(比如+、-等),参数必须是引用类型或指针类型。3. 后置运算符- (利用成员函数重载) class C private: double x; public: C( ) x=0.0; C(double a) x=a; C operator-(int) x-; return *this; ;C A(1);A-; 整型参数没有特别的意义,只是标识重载的

5、是后置运算符。 3. 后置运算符- (利用友元函数重载) class C private: double x; public: C( ) x=0.0; C(double a) x=a; friend C operator-(C &,int); ; C operator-(C &t,int) t.x-; return t; C A(1);A-; 整型参数没有特别的意义,只是标识重载的是后置运算符。 class C private: double x; public: C( ) x=0.0; C(double a) x=a; friend C operator-(C t) t.x-; return

6、 t; void show()coutxendl; ;void main()C c(5.6); (-c).show(); c.show(); 例:程序输出结果?4.65.61. 加号+ (利用成员函数重载) C C: operator+(C m ) C temp; temp.x=x+m.x; return temp; 二.双目运算符重载C a,b; C c=a+b; a.operator+(b)1. 加号+ (利用友元函数重载) 先在类中声明: friend C operator+(C ,C); 再在类外定义: C operator+(C m1, C m2 ) C temp; temp.x=m

7、1.x+m2.x; return temp; C a,b; C c=a+b; operator+(a,b)2. 乘号* (利用成员函数重载) C C: operator*(C m ) C temp; temp.x=x*m.x; return temp; C a,b; C c=a*b; a.operator*(b)2. 乘号*(利用友元函数重载) 先在类中声明: friend C operator*(C ,C); 再在类外定义: C operator*(C m1, C m2 ) C temp; temp.x=m1.x*m2.x; return temp; C a,b; C c=a*b; Oper

8、ator*(a,b)3. 复合运算符+= (利用成员函数重载) C C: operator+=(C m ) x+=m.x; return *this; C a,b; a+=b; a.operator+=(b)3. 复合运算符+= (利用友元函数重载) 先在类中声明: friend C operator+=(C & ,C); 再在类外定义: C operator+=(C &m1, C m2 ) m1.x+=m2.x; return m1; C a,b; a+=b; Operator+=(a,b)4. 赋值运算符= (利用成员函数重载) C C: operator=(C m ) x=m.x; re

9、turn *this; 实际上,系统为每一个类都生成了一个缺省的赋值运算符,在相同类型的实例之间可以直接相互赋值,甚至派生类的实例可以赋给基类实例。 但对某些特殊的情形,该缺省的赋值运算符会出现一些问题,如指针悬挂问题。 【例】利用类的缺省赋值运算符产生的指针悬挂问题 class CA char *ps; public: CA()ps=0; CA(char *s) ps=new charstrlen(s)+1; strcpy(ps,s); CA()if(ps) deleteps; char *GetS()return ps; ;void main(void)CA s1(China!),s2(C

10、omputer!);couts1=s1.GetS()t;couts2=s2.GetS()n;s1=s2; /A产生指针悬挂couts1=s1.GetS()t;couts2=s2.GetS()n;程序编译没有问题,但运行时出错!缺省赋值语句产生指针悬挂问题示意图。s1=s2撤消s2撤消s1出错s1s2“China!”“Computer!”指针悬挂s1“China!”“Computer!”已不存在s1s2“China!”“Computer!”无法撤消此时在类CA中可以对赋值运算符进行如下重载。CA & CA:operator=(CA &b)if(ps) deleteps; if(b.ps) ps=

11、new char strlen(b.ps)+1; strcpy(ps,b.ps); else ps=0;return *this;对赋值运算符进行重载时要注意以下三点: 一是只能利用成员函数重载,不能用友元函数重载; 二是重载的赋值运算符不能被继承; 三是不能将赋值运算符重载函数声明为虚函数。 5. 数组下标运算符 重载下标运算符的一般格式为: operator () /函数体 其中为一个参数,且仅有一个参数,该参数设定了下标值,通常为整型。 下标运算符必须利用类的成员函数来实现,而不能使用友元函数。 class ainteger int *a; int sz; public: aintege

12、r( int size) sz=size; a=new intsize; int & operator (int i ) if(i=sz) cout“error”0)arp=new intn;memset(arp,0,sizeof(int)*n);/string.hlen=n;else len=0;arp=0;int & CArray:operator(int index) /下标运 算符的实现 if(index=len|index0) /如果参数 index超出规定的范围,则输出越界信息 coutnError:下标index出界!n;exit(2); /stdlib.h return arp

13、index; /如果不越界,则返回 相应的数据 void main(void)CArray m1(10),m2(3);int i;for(i=0;i10;i+) m1i=i; / 重载数组下标的使用for(i=1;i11;i+) /Bcoutm1i ;/Ccoutn;m22=26;coutm22=m22n;6. 相等运算符=【例】判断两个复数是否相等 class comp float real,ima; public: comp(float r=0,float i=0)real=r;ima=i; bool operator=(comp m) if(real=m.real & ima=m.ima

14、) return true; else return false; ;void main()comp c1(5,6),c2(3,6); if(c1=c2) cout两复数相等endl; else cout两复数不相等endl;7 重载函数调用运算符 x(arg1, arg2,arg3) class myclass int i; float j; public: myclass(int x=0, float y=0.0) i=x; j=y; myclass operator( ) (int k, float m); void display( ) couti“ “jendl; ; myclass myclass:operator( ) (int k, float m) i=k+10; j=m+10.5; return *this; void main( ) myclass obj1(10, 11.5); obj1.display( ); obj1(100, 6.9); obj1.display( ); 10 11.511

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论