运算符重载及流类库课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《运算符重载及流类库课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运算 重载 流类库 课件
- 资源描述:
-
1、2022-12-171第七章运算符重载及流类库运算符重载类运算符和友元运算符+和运算符的重载流类库运算符“”的重载格式控制文件操作方式流的错误处理2022-12-172运算符重载对基本数据类型,“+”、“”等,C+用一种简洁的方式工作。例:int x,y,z;z=x+y;若有复数类complex:class complexpublic:double real,imag;complex(double r=0,double i=0)real=r;imag=i;complex c1(1.1,2.3),c2(2.2,1.3),total;total=c1+c2;2022-12-173运算符重载运算符重
2、载通过创建operator()和一个运算符连用构成运算符函数实现格式:Type operator (参数表)/(函数定义)例:int operator+(x,y)返回值type不能是void表示要重载的运算符,编译时首先检查传递给函数的参数类型,如果看到是自定义的类型,则执行用户自己的函数2022-12-174运算符重载complex operator+(complex om1,complex om2)complex temp;temp.real=om1.real+om2.real;temp.imag=om1.imag+om2.imag;return temp;total=c1+c2;(tot
3、al=operator+(c1,c2);)2022-12-175运算符重载说明:只能重载C+语言中原先已有定义的运算符不能重载:.*:?:#不能改变运算符的操作数个数不能改变原有的优先级 x=y-a*b;不能改变原有的结合性 x=a/b*c;不能改变运算符对预定义类型数据的操作方式 +:为加法运算,无法重载而改变它对预定义类型数据的操作方式 重载运算符时至少有一个自定义类型的数据作为操作数2022-12-176类运算符成员运算符函数定义的语法形式:class X type operator (参数表);说明:重载单目运算符,则参数表为空;若运算符为双目运算符,则参数表中有一个操作数。双目运算符
4、重载:class X int operator+(X a);说明:参数作为运算符的右操作数。当前对象作为运算符的左操作数,通过this指针隐含地传递给函数2022-12-177class complexpublic:double real,imag;complex(double r=0,double i=0)real=r;imag=i;complex operator+(complex c)complex temp;temp.real=c.real+real;temp.imag=c.imag+imag;return temp;void main()complex A1(2.3,4.6),A2(
5、3.6,2.8),A3;A3=A1+A2;(解释为:A3=A1.operator+(A2);)采用成员函数重载双目运算符后,使用的方法:aabb;aa.operator(bb);类运算符双目运算符2022-12-178类运算符单目运算符单目运算符重载:参数通过this 指针隐含地传递给函数class c int x,y;public:c(int i=0,int j=0)x=i;y=j;c operator+()+x;+y;return*this;void main()c ob(10,20);+ob;ob.operator+();采用成员函数重载单目运算符后,使用的方法:aa;aa.operat
6、or();2022-12-179双目运算符可以被重载为成员函数,但有一种情况:例:成员运算符函数重载了+运算符 ob=ob+100 解释为ob.operator+(100)但:ob=100+ob;解释为100.operator+(ob)错误类运算符2022-12-1710友元运算符友元运算符函数定义的语法形式:friend type operator(参数表);说明:友元函数没有this指针,若重载的是双目运算符,则参数表中有两个操作数;若重载的是单目运算符,则参数表中有一个操作数2022-12-1711友元运算符双目运算符class complexpublic:double real,ima
7、g;complex(double r=0,double i=0)real=r;imag=i;friend complex operator+(complex a,complex b)complex temp;temp.real=a.real+b.real;temp.imag=a.imag+b.imag;return temp;void main()complex A1(2.3,4.6),A2(3.6,2.8),A3;A3=A1+A2;采用友元函数重载双目运算符后,使用的方法:aabb;operator(aa,bb);2022-12-1712友元运算符单目运算符class c int x,y;p
8、ublic:c(int i=0,int j=0)x=i;y=j;void show()coutxy;/operator int()return x;friend c operator+(c op)+op.x;+op.y;return op;void main()c ob(10,20);ob.show();+ob;/cout不要改变操作数时,可采用传值的方法。2022-12-1713成员运算符函数和友元运算符函数的比较双目运算符:成员运算符函数带有一个参数,而友元运算符函数带有两个参数。单目运算符:成员运算符函数不带参数,而友元运算符函数带有一个参数成员运算符函数和友元运算符函数的两种调用方式。
9、习惯形式友元运算符函数的调用 成员运算符函数的调用a+boperator+(a,b)a.operator+(b)-aoperator-(a)a.operator-()a+operator+(a,0)a.operator+(0)对于双目运算符,将它重载为一个友元运算符函数比重载为成员运算符函数便于使用。若运算符的操作要修改类对象的状态,则选成员运算符函数较好如运算符所需的操作数(尤其是第一个操作数需)希望有隐式类型转换,则必须用友元2022-12-1714+和-运算符的重载对前缀方式+ob,可以用运算符函数重载为:ob.operator+();(成员函数)或 operator+(X&ob);(友
10、元函数)对后缀方式ob+,可以用运算符函数重载为:ob.operator+(int);(成员函数)或 operator+(X&ob,int);(友元函数)调用时参数int一般被传递给值02022-12-1715class over int i1,i2;public:void init(int I1,int I2)i1=I1;i2=I2;void print()couti1i2”,该类提供了流的大部分输入操作输出流(ostream)针对系统全部的预定义类型重载了输入运算符“”,该类提供了流的主要输出操作:文件流(fstreambase):提供了文件流的公共操作串流(strstreambase):
11、专门处理串流2022-12-1719流类库4种基本流类组合派生出实用流:输入/输出流(iostream):输入/输出文件流(fstream):输入/输出串流(strstream):屏幕输出流(constream):输入文件流(ifstream):输出文件流(ofstream):输入串流(istrstream):输出串流(ostrstream):例:iostream是通过多重继承从输入流类istream和输出流类ostream派生而来的。支持双向操作。class ios;class istream:virtual public ios;class ostream:virtual public i
12、os;class iostream:public istream,public ostream;2022-12-1720在istream、ostream、iostream类的基础上重载“=”,产生istream_withassign、ostream_withassign和 iostream_withassign流类库2022-12-1721流类库执行C+程序时,系统自动打开几个预定义流,用户在程序中直接使用iostream.h:标准I/O流头文件,在该文件中对各个流类定义了各自的全局对象。cin:是istream_withassign类的对象,称为标准输入流,缺省为键盘cout:是ostrea
13、m_withassign类的对象,称为标准输出流,缺省为显示器cerr和clog:是ostream_withassign类的对象,称为标准错误输出流,固定关联到显示器。cerr没有被缓冲,因而发送给它的任何内容都立即输出;相反clog被缓冲了,只有当缓冲区满时才输出2022-12-1722例:要为用户计算平均价格,但用户的输入不恰当(例如输入发除数为零),下面的代码能检测用户所输入的数值并显示出相应的错误信息。coutnum;if(num=0)cerr:双目运算符,有两个操作数,左操作数是istream类的一个对象,右操作数既可以是一个预定义类型的变量,也可以是重载了该运算符的类对象缺省时:运
14、算符跳过空白符,然后读入与输入变量类型相对应的值。因此,给一组变量输入值时可用空格或换行把键入的数值间隔开。int n;float x;cinnx;当输入字符串时:运算符跳过空白符,读入以下的非空白字符,直到遇到另一个空白字符为止,并在串尾放一个字符0。char*str;cinstr;输入:object programming!则:str=“object”2022-12-1724预定义类型的输入输出不同类型的变量一起输入时,系统除检查是否含有空白符外,还完成输入数据与变量类型的匹配int n;float x;cinnx;输入:35.78 89.25则:n=35 x=.78输入运算符采用左结合方
15、式工作,并返回它的左操作数。2022-12-1725预定义类型的输入输出输出运算符:双目运算符,有两个操作数,左操作数是ostream类的对象,右操作数既可以是一个预定义类型的变量,也可以是重载了该运算符的类对象运算符:采用左结合方式工作,并且返回它的左操作数。使用进行输出操作时,编译程序根据出现在运算符右边的变量的类型决定调用重载该运算符的哪个版本重载不能改变运算符的优先级coutx&yn;2022-12-1726运算符的重载:重载格式为 ostream&operator(ostream&stream,CLASSA a)对于类CLASSA的输出操作 return stream;说明:假设定义
16、为成员函数则左运算数应当是调用运算符函数的类的对象,但重载时左操作数是流第一个参数为ostream类的一个引用第二个参数为自定义的类类型的对象返回第一个参数,使能连续使用例:coutab;operator(cout,a)2022-12-1727为复数类型重载#include class complex private:float Re,Im;public:complex(float r=0,float i=0)Re=r;Im=i;friend ostream&operator(ostream&s,complex c)sc.Re“+”;sc.Im“i”endl;return s;void mai
17、n()complex a(3,4),b(5,6);couta#include class complex private:float Re,Im;public:complex(float r=0,float i=0)Re=r;Im=i;friend istream&operator(istream&s,complex c)sc.Rec.Im;return s;void main()complex a(3,4),b(5,6);cinab;输入1 2 3 4(注意不能输入1,2,3,4逗号不是间隔)a=?2022-12-1729运算符的重载istream&operator(istream&in,u
展开阅读全文