第8讲 运算符重载优秀课件.ppt

上传人:石*** 文档编号:91070375 上传时间:2023-05-21 格式:PPT 页数:38 大小:1.49MB
返回 下载 相关 举报
第8讲 运算符重载优秀课件.ppt_第1页
第1页 / 共38页
第8讲 运算符重载优秀课件.ppt_第2页
第2页 / 共38页
点击查看更多>>
资源描述

《第8讲 运算符重载优秀课件.ppt》由会员分享,可在线阅读,更多相关《第8讲 运算符重载优秀课件.ppt(38页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第8讲 运算符重载第1页,本讲稿共38页Contents 8.1 概述18.2 运算符重载的一般规则28.3 运算符重载的两种形式38.4 几个常用运算符的重载4第2页,本讲稿共38页8.1 概述概述在在C+中,同一个运算符中,同一个运算符“+”可以完成不同类型的数据运可以完成不同类型的数据运算。算。C+语言针对基本数据类型已经对某些运算符做了运算符重载,语言针对基本数据类型已经对某些运算符做了运算符重载,由由编译程序自动完成编译程序自动完成的,无需程序员进行任何操作。的,无需程序员进行任何操作。然而,在解决各种各样的实际问题时往往需要使用许多自定然而,在解决各种各样的实际问题时往往需要使用许

2、多自定义的数据类型。这些自定义类型的重载必须由程序员自己完义的数据类型。这些自定义类型的重载必须由程序员自己完成。成。第3页,本讲稿共38页l例如,在解决科学计算问题时常要用到复数的运算,下面定义一例如,在解决科学计算问题时常要用到复数的运算,下面定义一个简化的复数类个简化的复数类complex:class complex double real,imag;complex(double r=0,double i=0)real=r;imag=i;l如果定义类如果定义类complex的两个对象的两个对象c1和和c2,再把,再把c1和和c2加在一起,加在一起,这样的运算能不能实现呢?答案是否定的。这

3、样的运算能不能实现呢?答案是否定的。void main()complex c1(1.1,2.2),c2(3.3,4.4),total;total=c1+c2;/编译错误编译错误第4页,本讲稿共38页【例例8.1】使用成员函数完成复数的加法运算。使用成员函数完成复数的加法运算。#include class complex/complex类声明类声明private:double x,y;/实部为实部为x,虚部为,虚部为ypublic:complex(double xx=0,double yy=0)/构造函数构造函数 x=xx;y=yy;double getx()/得到实部得到实部x值值 retur

4、n x;double gety()/得到虚部得到虚部y值值return y;第5页,本讲稿共38页void display()/输出复数输出复数 cout(0)cout+y*i);else if(y0)couty*i);else coutx=c1.x+c2.x;this-y=c1.y+c2.y;return*this;void main()complex c1(3,4),c2(4,-5),c3;c3.add(c1,c2);c1.display();cout+;c2.display();cout=;c3.display();cout endl;程序运行结果:程序运行结果:(3+4*i)+(4-5

5、*i)=(7-1*i)第6页,本讲稿共38页只能重载只能重载C+中已经存在的运算符,不许定义新运算符。中已经存在的运算符,不许定义新运算符。不能改变运算符的语法结构,即操作数的个数。不能改变运算符的语法结构,即操作数的个数。不能改变不能改变C+语言中已定义的运算符的优先顺序和结合性。语言中已定义的运算符的优先顺序和结合性。一般不改变运算符功能。一般不改变运算符功能。不能重载的运算符:不能重载的运算符:sizeof();成员运算符;成员运算符(.);指向成员的指针运;指向成员的指针运算符算符(*);作用域运算符;作用域运算符(:);条件运算符;条件运算符(?:)。必须和用户自定义的类对象一起使用

6、,其参数至少应有一个是类的对象或必须和用户自定义的类对象一起使用,其参数至少应有一个是类的对象或对象的引用。对象的引用。重载运算符函数不能含有默认的参数。重载运算符函数不能含有默认的参数。运算符只能被显式重载。运算符只能被显式重载。8.2 运算符重载规则运算符重载规则第7页,本讲稿共38页8.3.1 用成员函数重载运算符8.3.2 用友元函数重载运算符 returnreturn第8页,本讲稿共38页1、重载为成员函数、重载为成员函数函数类型函数类型 类名类名:operator 运算符(参数表)运算符(参数表)函数体函数体;其中,其中,“函数类型函数类型”是成员函数的返回值类型;是成员函数的返回

7、值类型;“类名类名”是重载该运算符的是重载该运算符的类;类;“operator”是关键字,是重载运算符标志;是关键字,是重载运算符标志;“运算符运算符”是是要重载的运算符;要重载的运算符;“参数表参数表”表示该运算符所需要的操作数,表示该运算符所需要的操作数,二元运算符重载为类的成员函数,它们包含一个形参,即运算二元运算符重载为类的成员函数,它们包含一个形参,即运算符右侧的操作数。符右侧的操作数。注意:注意:要重载的运算符必须置于关键字要重载的运算符必须置于关键字operator之后。之后。8.3 运算符重载形式第9页,本讲稿共38页【例例8.2】用成员函数重载算术运算符用成员函数重载算术运算

8、符“+”。#include class complex private:double x,y;public:complex(double xx=0,double yy=0)x=xx;y=yy;double getx()return x;double gety()return y;void display()cout(0)cout+y*i);else if(y0)couty*i);else coutx+c1.x;/不要不要this可以吗?可以吗?c.y=this-y+c1.y;return c;void main()complex c1(3,4),c2(4,-5),c3;c3=c1+c2;/使用

9、重载的运算符使用重载的运算符“+”c1.display();cout+;c2.display();cout=;c3.display();cout endl;程序运行结果:程序运行结果:(3+4*i)+(4-5*i)=(7-1*i)第11页,本讲稿共38页 现在可以使用以下语句将对象进行加操作:obj3=obj1+obj2;/类complex 对象 运算符“+”可以访问两个对象:运算符左侧对象obj1是将要调用重载运算符函数的对象,右侧对象obj2作为函数调用的参数,也就是说编译程序将其解释为obj3=obj1.operator+(obj2)的形式。由此可见,当重载为成员函数时,双目运算符仅有一

10、个参数。对于单目运算符,重载为成员函数时,不需要再说明参数。重载为成员函数时,总是隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。第12页,本讲稿共38页 运算符重载为类的友元函数的一般语法形式如下:friend 函数类型 operator 运算符(形参表)函数体;其中:“friend”是运算符重载为友元函数时,在函数类型说明之前使用的关键字。二元运算符重载作为友元函数,它们含有两个参数。8.3.2 用友元函数重载运算符第13页,本讲稿共38页【例8.3】用友元函数重载关系运算符!=。#include class complex /complex类声明priv

11、ate:double x,y;/实部为x,虚部为ypublic:complex(double xx=0,double yy=0)/构造函数x=xx;y=yy;double getx()/得到实部x值return x;第14页,本讲稿共38页double gety()/得到虚部y值return y;void display()cout(0)cout+y*i);else if(y0)couty*i);else coutendl;friend bool operator!=(complex&c1,complex&c2);bool operator!=(complex&c1,complex&c2)bo

12、ol c;c=(c1.x!=c2.x)|(c1.y!=c2.y);return c;第15页,本讲稿共38页void main()complex c1(3,4),c2(4,3);bool b;b=c1!=c2;c1.display();cout!=;c2.display();b?cout is True.endl:cout is False.endl;cout、=运算符时,运算符函数必须声明为类的成员函数。第23页,本讲稿共38页2重载为类的友元函数 单目运算符重载为类的成员函数时,不能再显示说明参数。因为重载为类的成员函数时总是隐藏了一个参数,该参数就是this指针。this指针是指向调用该

13、成员函数对象的指针。当重载为类的友元函数时,由于不存在隐含的this指针,对单目运算符来说,友元函数有一个参数。【例8.5】用友元函数重载运算符+。#include iostream.hclass Pointprivate:int xcoord;int ycoord;public:Point()xcoord=0;ycoord=0;第24页,本讲稿共38页Point(int x,int y)xcoord=x;ycoord=y;void display()cout“(”xcoord”,”ycoord”)”endl;friend Point operator+(Point&);/前缀自增friend

14、 Point operator+(Point&,int);/后缀自增;Point operator+(Point&e)return Point(+e.xcoord,+e.ycoord);Point operator+(Point&e,int)return Point(e.xcoord+,e.ycoord+);第25页,本讲稿共38页void main()Point p1(10,10),p2;p2=p1+;p1.display();p2.display();p2=+p1;p1.display();p2.display();两种运算符重载形式的比较:一般情况下,单目运算符常使用成员函数形式重载运算

15、符,而双目运算符常使用友元函数形式进行运算符重载。当需要重载运算符具有可交换性时,选择重载为友元函数更为适宜。程序运行结果为:程序运行结果为:(11,11)(10,10)(12,12)(12,12)returnreturn第26页,本讲稿共38页1双目算术运算符重载 双目运算符重载为类的成员函数,它们包含一个形参,即运算符右侧的值。例如,当要完成obj1+obj2时,重载运算符+为成员函数的声明为:Example operator+(Example obj2)作为友元函数,它们含有两个参数。例如:friend Example operator+(Example obj1,Example obj

16、2)需要两个操作数进行运算。【例8.6】重载算术运算符“*”。#include class complex /complex类声明private:double x,y;/实部为x,虚部为y8.4.2 双目运算符重载第27页,本讲稿共38页public:complex(double xx=0,double yy=0)/构造函数x=xx;y=yy;double getx()/得到实部x值return x;double gety()/得到虚部y值return y;第28页,本讲稿共38页void display()cout(0)cout+y*i);else if(y0)couty*i);else c

17、outendl;friend complex operator*(complex&c1,complex&c2);complex operator*(complex&c1,complex&c2)complex c;c.x=c1.x*c2.x-c1.y*c2.y;c.y=c1.x*c2.y+c1.y*c2.x;return c;第29页,本讲稿共38页void main()complex c1(3,4),c2(5,10),c3;c3=c1*c2;/使用友元函数重载的运算符*c1.display();cout*;c2.display();cout=;c3.display();coutendl;程序运

18、行结果为:(3+4*i)*(5+10*i)=(-25+50*i)第30页,本讲稿共38页2重载比较和逻辑运算符 比较和逻辑运算符是双目运算符,双目运算符需要两个对象才能进行比较。可重载的比较运算符包括,=,=和!=。可重载的逻辑运算符包括&和|。例如:int String:operator(String ss)return(strcmp(str,ss.str);【例8.7】用成员函数重载关系运算符“=”。#include iostream.hclass complex /complex类声明private:double x,y;/实部为x,虚部为y第31页,本讲稿共38页public:comp

19、lex(double xx=0,double yy=0)/构造函数x=xx;y=yy;double getx()/得到实部x值return x;double gety()/得到虚部y值return y;第32页,本讲稿共38页void display()cout(0)cout+y*i);else if(y0)couty*i);else coutendl;bool operator=(complex&c1);bool complex:operator=(complex&c1)bool b;b=x*x+y*y=c1.x*c1.x+c1.y*c1.y;return b;第33页,本讲稿共38页voi

20、d main()complex c1(33,24),c2(45,-15);bool bl;bl=c1=c2;/使用重载的运算符c1.display();cout=;c2.display();bl?cout is True.endl:cout is False.endl;程序运行结果为:程序运行结果为:(33+24*i)=(45-15*i)is True.第34页,本讲稿共38页3重载赋值运算符 如果数据成员包含指针且已经使用运算符new分配内存,默认赋值运算符仅将源对象逐字节复制到目的对象。【例8.8】重载赋值运算符“=”。#include class CPoint private:long

21、x,y;public:CPoint(long x1=0,long y1=0)x=x1;y=y1;CPoint operator=(CPoint p);void print()cout(x ,y)endl;第35页,本讲稿共38页CPoint CPoint:operator=(CPoint p)x=p.x;y=p.y;return p;void main()CPoint p1(10,10),p2(20,20);cout赋值前:endl;coutp1:;p1.print();coutp2:;p2.print();p1=p2;cout赋值后:endl;coutp1:;p1.print();coutp2:;p2.print();程序运行结果为:程序运行结果为:赋值前:赋值前:p1:(:(10,10)p2:(:(20,20)赋值后:赋值后:p1:(:(20,20)p2:(:(20,20)第36页,本讲稿共38页第37页,本讲稿共38页第38页,本讲稿共38页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 资格考试

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁