版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年茶艺师初级理论知识真题及答案
- 2026年骨科基础理论试题及答案
- 明挖基坑常见开挖方案
- 2026年会计上半年工作总结
- 2026福建福州市鼓楼公证处招聘公证助理人员1人笔试参考题库及答案解析
- 2026四川成都华天引力文化发展有限责任公司招聘3人考试参考试题及答案解析
- 2026广西崇左天等县委巡察办招聘编外工作人员1人笔试参考题库及答案解析
- 2026江苏南京信息工程大学科研助理招聘1人备考题库(章炎麟教授科研团队)附答案详解(综合题)
- 2025湖南衡阳市市属国有企业急需紧缺专业技术人才引进岗位调整笔试历年备考题库附带答案详解
- 2026浙江温州市老干部活动中心招聘编外人员1人备考题库附答案详解(研优卷)
- 206内蒙古环保投资集团有限公司社会招聘17人考试备考题库及答案解析
- 道法薪火相传的传统美德课件-2025-2026学年统编版道德与法治七年级下册
- 2026浙江省海洋风电发展有限公司校园招聘笔试备考题库及答案解析
- 学前教育普惠性家庭参与研究课题申报书
- 2026广东深圳市优才人力资源有限公司公开招聘聘员(派遣至龙城街道)18人备考题库附答案详解(典型题)
- 2024-2025学年度哈尔滨传媒职业学院单招考试文化素质数学通关题库完美版附答案详解
- 2026年安徽国际商务职业学院单招职业技能测试题库附参考答案详解(培优)
- 2026年哈尔滨北方航空职业技术学院单招职业技能考试题库附答案详解
- 循环流化床锅炉检修导则
- 日本横河cs3000DCS操作手册
- 干煤棚网壳施工监理实施细则
评论
0/150
提交评论