C运算符重载学习教案

上传人:莉**** 文档编号:110294201 上传时间:2022-06-18 格式:PPTX 页数:35 大小:197.08KB
收藏 版权申诉 举报 下载
C运算符重载学习教案_第1页
第1页 / 共35页
C运算符重载学习教案_第2页
第2页 / 共35页
C运算符重载学习教案_第3页
第3页 / 共35页
资源描述:

《C运算符重载学习教案》由会员分享,可在线阅读,更多相关《C运算符重载学习教案(35页珍藏版)》请在装配图网上搜索。

1、会计学1C运算符重载运算符重载(zhn zi)第一页,共35页。引子(yn zi)第1页/共35页第二页,共35页。 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) C temp(x+m.x); return temp; / ;/定义(dngy)方式第2页/共35页第三页,共35页。1. 1. 负号负号“-” (“

2、-” (利用利用(lyng)(lyng)成员函数重载成员函数重载) ) C C: operator - ( ) C C: operator - ( ) C temp; C temp; temp.x=-x; temp.x=-x; return temp; return temp; 一.单目运算符重载(zhn zi) C c=-a; a.operator-( )第3页/共35页第四页,共35页。1. 1. 负号负号“-” (“-” (利用利用(lyng)(lyng)友元函数重载友元函数重载) ) class C class C / / public: public: friend C operat

3、or-(const C); friend C operator-(const C); / / ; ; C operator- (const C m ) C operator- (const C m ) C temp; C temp; temp.x=-m.x; temp.x=-m.x; return temp; return temp; C c=-a; operator-(a)第4页/共35页第五页,共35页。第5页/共35页第六页,共35页。2. 2. 前置前置(qin zh)(qin zh)运算符运算符+ (+ (利用成员函数重载利用成员函数重载) ) class C class C pri

4、vate: private: double x; double x; public: public: C( ) x=0.0; C( ) x=0.0; C(double a) C(double a) x=a; x=a; C operator+() C operator+() x+; x+; return return * *this;this; ; ;C A(1);+A;第6页/共35页第七页,共35页。2. 2. 前置运算符前置运算符+ (+ (利用友元函数利用友元函数(hnsh)(hnsh)重载重载) ) class C class C private: private: double x;

5、 double x; public: public: C( ) x=0.0; C( ) x=0.0; C(double a) x=a; C(double a) x=a; friend C operator+(C &); friend C operator+(C &); ; ; C operator+(C &t) C operator+(C &t) t.x+; t.x+; return t; return t; C A(1);+A; 对于要改变操作数的运算符对于要改变操作数的运算符( (比如比如+、-等等) ),参数必须是引用类型,参数必须是引用类型(lixng)(lixng)或指针类型或指针类

6、型(lixng)(lixng)。第7页/共35页第八页,共35页。3. 3. 后置运算符后置运算符- (- (利用成员利用成员(chngyun)(chngyun)函数重载函数重载) ) class C class C private: private: double x; double x; public: public: C( ) x=0.0; C( ) x=0.0; C(double a) C(double a) x=a; x=a; C operator-(int) C operator-(int) x-; x-; return return * *this;this; ; ;C A(1)

7、;A-; 整型参数没有整型参数没有(mi yu)(mi yu)特别的意义,只是标识重载的是后置运算符。特别的意义,只是标识重载的是后置运算符。 第8页/共35页第九页,共35页。3. 3. 后置运算符后置运算符- (- (利用利用(lyng)(lyng)友元函数重载友元函数重载) ) class C class C private: private: double x; double x; public: public: C( ) x=0.0; C( ) x=0.0; C(double a) x=a; C(double a) x=a; friend C operator-(C &,int);

8、friend C operator-(C &,int); ; ; C operator-(C &t,int) C operator-(C &t,int) t.x-; t.x-; return t; return t; C A(1);A-; 整型参数没有特别的意义,只是标识重载整型参数没有特别的意义,只是标识重载(zhn zi)(zhn zi)的是后置运算符。的是后置运算符。 第9页/共35页第十页,共35页。class C private: double x; public: C( ) x=0.0; C(double a) x=a; friend C operator-(C t) t.x-;

9、return t; void show()coutxendl; ;void main()C c(5.6); (-c).show(); c.show(); 例:程序(chngx)输出结果?4.65.6第10页/共35页第十一页,共35页。1. 1. 加号加号(ji ho)+ (ji ho)+ (利用成员函数重载利用成员函数重载) ) C C: operator+(C m ) C C: operator+(C m ) C temp; C temp; temp.x=x+m.x; temp.x=x+m.x; return temp; return temp; 二.双目运算符重载(zhn zi)C a,

10、b; C c=a+b; a.operator+(b)第11页/共35页第十二页,共35页。1. 1. 加号加号+ (+ (利用友元函数利用友元函数(hnsh)(hnsh)重载重载) ) 先在类中声明:先在类中声明: friend C operator+(C ,C); friend C operator+(C ,C); 再在类外定义:再在类外定义: C operator+(C m1, C m2 ) C operator+(C m1, C m2 ) C temp; C temp; temp.x=m1.x+m2.x; temp.x=m1.x+m2.x; return temp; return tem

11、p; C a,b; C c=a+b; operator+(a,b)第12页/共35页第十三页,共35页。2. 2. 乘号乘号* * ( (利用利用(lyng)(lyng)成员函数重载成员函数重载) ) C C: operator C C: operator* *(C m )(C m ) C temp; C temp; temp.x=x temp.x=x* *m.x;m.x; return temp; return temp; C a,b; C c=a*b; a.operator*(b)第13页/共35页第十四页,共35页。2. 2. 乘号乘号* *( (利用友元函数利用友元函数(hnsh)(h

12、nsh)重载重载) ) 先在类中声明:先在类中声明: friend C operator friend C operator* *(C ,C);(C ,C); 再在类外定义:再在类外定义: C operator C operator* *(C m1, C m2 )(C m1, C m2 ) C temp; C temp; temp.x=m1.x temp.x=m1.x* *m2.x;m2.x; return temp; return temp; C a,b; C c=a*b; Operator*(a,b)第14页/共35页第十五页,共35页。3. 3. 复合复合(fh)(fh)运算符运算符+=

13、 (+= (利用成员函数重载利用成员函数重载) ) C C: operator+=(C m ) C C: operator+=(C m ) x+=m.x; x+=m.x; return return * *this;this; C a,b; a+=b; a.operator+=(b)第15页/共35页第十六页,共35页。3. 3. 复合运算符复合运算符+= (+= (利用利用(lyng)(lyng)友元函数重载友元函数重载) ) 先在类中声明:先在类中声明: friend C operator+=(C & ,C); friend C operator+=(C & ,C); 再在类外定义:再在类

14、外定义: C operator+=(C &m1, C m2 ) C operator+=(C &m1, C m2 ) m1.x+=m2.x; m1.x+=m2.x; return m1; return m1; C a,b; a+=b; Operator+=(a,b)第16页/共35页第十七页,共35页。4. 4. 赋值运算符赋值运算符= (= (利用成员函数利用成员函数(hnsh)(hnsh)重载重载) ) C C: operator=(C m ) C C: operator=(C m ) x=m.x; x=m.x; return return * *this;this; 第17页/共35页第

15、十八页,共35页。n 实际上,系统为每一个类都生成(shn chn)了一个缺省的赋值运算符,在相同类型的实例之间可以直接相互赋值,甚至派生类的实例可以赋给基类实例。n 但对某些特殊的情形,该缺省的赋值运算符会出现一些问题,如指针悬挂问题。 第18页/共35页第十九页,共35页。【例】利用类的缺省赋值运算符产生的指针(zhzhn)悬挂问题 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;

16、 ;第19页/共35页第二十页,共35页。void main(void)CA s1(China!),s2(Computer!);couts1=s1.GetS()t;couts2=s2.GetS()n;s1=s2; /A产生指针(zhzhn)悬挂couts1=s1.GetS()t;couts2=s2.GetS()n;程序编译没有(mi yu)问题,但运行时出错!第20页/共35页第二十一页,共35页。n 缺省赋值语句产生指针悬挂(xungu)问题示意图。s1=s2撤消s2撤消s1出错(ch cu)s1s2“China!”“Computer!”指针悬挂s1“China!”“Computer!”已不

17、存在s1s2“China!”“Computer!”无法撤消第21页/共35页第二十二页,共35页。此时(c sh)在类CA中可以对赋值运算符进行如下重载。CA & CA:operator=(CA &b)if(ps) deleteps; if(b.ps) ps=new char strlen(b.ps)+1; strcpy(ps,b.ps); else ps=0;return *this;第22页/共35页第二十三页,共35页。n 对赋值运算符进行重载时要注意(zh y)以下三点:n 一是只能利用成员函数重载,不能用友元函数重载;n 二是重载的赋值运算符不能被继承;n 三是不能将赋值运算符重载函

18、数声明为虚函数。 第23页/共35页第二十四页,共35页。5. 5. 数组下标数组下标(xi (xi bio)bio)运算符运算符 n 重载下标运算符的一般格式为:n o p e r a t o r ( ) /函数体n 其中为一个参数,且仅有一个参数,该参数设定(sh dn)了下标值,通常为整型。n 下标运算符必须利用类的成员函数来实现,而不能使用友元函数。 第24页/共35页第二十五页,共35页。 class ainteger int *a; int sz; public: ainteger( int size) sz=size; a=new intsize; int & operator

19、(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;第27页/共35页第二十八页,共35页。int & CArray:operator(int index) /下标运 算符的实现(shxin) if(index=len|index0) /如果参数 index超出规定的范围,则输出越界信息 coutnError:下标index出界!n;exit(2); /stdlib.h return arpindex; /如果不越界,则返回 相应的数据 第

20、28页/共35页第二十九页,共35页。void main(void)CArray m1(10),m2(3);int i;for(i=0;i10;i+) m1i=i; / 重载数组下标的(bio de)使用for(i=1;i11;i+) /Bcoutm1i ;/Ccoutn;m22=26;coutm22=m22n;第29页/共35页第三十页,共35页。6. 6. 相等相等(xingdng)(xingdng)运算符运算符=【例】判断(pndun)两个复数是否相等 class comp float real,ima; public: comp(float r=0,float i=0)real=r;i

21、ma=i; bool operator=(comp m) if(real=m.real & ima=m.ima) return true; else return false; ;第30页/共35页第三十一页,共35页。void main()comp c1(5,6),c2(3,6); if(c1=c2) cout两复数(fsh)相等endl; else cout两复数(fsh)不相等endl;第31页/共35页第三十二页,共35页。7 7 重载重载(zhn(zhn z zi) i)函函数调用运算符数调用运算符 x(arg1, x(arg1, arg2,arg3)arg2,arg3) class

22、 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.disp

23、lay( ); 10 11.5110 17.4x.operator( ) (arg1,arg2,arg3)第32页/共35页第三十三页,共35页。重载应注意的问题:重载应注意的问题: 1 1、优先级和结合顺序不变、优先级和结合顺序不变 2 2、不能改变目数、不能改变目数 3 3、友元函数重载至少有一个、友元函数重载至少有一个(y )(y )相应类相应类的参数的参数 4 4、只能重载已有的运算符,不能创造、只能重载已有的运算符,不能创造新的新的 5 5、成员和外部运算符函数可重载(多个同、成员和外部运算符函数可重载(多个同名运算符函数)名运算符函数)不能重载不能重载(zhn zi)(zhn zi)的运算符:的运算符:. , . , * * , : , ?: , sizeof , : , ?: , sizeof第33页/共35页第三十四页,共35页。课后练习:试卷(shjun)汇编 P8T10 P19T12 P28T13 P32T27 P36T13 P41T4 P45T13 P56T13第34页/共35页第三十五页,共35页。

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!