ImageVerifierCode 换一换
格式:PPT , 页数:48 ,大小:313KB ,
资源ID:379837      下载积分:20 文钱
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,省得不是一点点
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.wenke99.com/d-379837.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(运算符重载及流类库.PPT)为本站会员(天***)主动上传,文客久久仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文客久久(发送邮件至hr@wenke99.com或直接QQ联系客服),我们立即给予删除!

运算符重载及流类库.PPT

1、第七章运算符重载及流类库,运算符重载类运算符和友元运算符+和运算符的重载流类库运算符“”的重载格式控制文件操作方式流的错误处理,运算符重载,对基本数据类型,“ + ”、“”等,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;,运算符重载,运算符重载通过创建operator()和一个运算符

2、连用构成运算符函数实现格式:Type operator (参数表) /(函数定义) 例:int operator + (x,y)返回值type不能是void表示要重载的运算符,编译时首先检查传递给函数的参数类型,如果看到是自定义的类型,则执行用户自己的函数,运算符重载,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;(total=operator+(c1,c2);)

3、,运算符重载,说明:只能重载C+语言中原先已有定义的运算符不能重载: . .* : ?: # 不能改变运算符的操作数个数不能改变原有的优先级 x=y-a*b;不能改变原有的结合性 x=a/b*c;不能改变运算符对预定义类型数据的操作方式 +:为加法运算,无法重载而改变它对预定义类型数据的操作方式 重载运算符时至少有一个自定义类型的数据作为操作数,类运算符,成员运算符函数定义的语法形式: class X type operator (参数表);说明:重载单目运算符,则参数表为空;若运算符为双目运算符,则参数表中有一个操作数。双目运算符重载: class X int operator +(X a)

4、;说明:参数作为运算符的右操作数。当前对象作为运算符的左操作数,通过this指针隐含地传递给函数,class 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(3.6,2.8),A3; A3=A1+A2;(解释为:A3=A1.

5、operator+(A2);),采用成员函数重载双目运算符后,使用的方法:aabb;aa.operator(bb);,类运算符双目运算符,类运算符单目运算符,单目运算符重载:参数通过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.operator();,双目运算符可以被重载为成员函数,但有一种

6、情况: 例:成员运算符函数重载了+运算符 ob=ob+100 解释为ob. operator+(100) 但:ob=100+ob; 解释为100. operator+(ob) 错误,类运算符,友元运算符,友元运算符函数定义的语法形式: friend type operator (参数表);说明:友元函数没有this指针,若重载的是双目运算符,则参数表中有两个操作数;若重载的是单目运算符,则参数表中有一个操作数,友元运算符双目运算符,class complexpublic:double real,imag;complex(double r=0,double i=0) real=r;imag=i;

7、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);,友元运算符单目运算符,class c int x,y;public: c(int i=0,int j=0) x=i;y=j; void show()cou

8、txy; /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不要改变操作数时,可采用传值的方法。,成员运算符函数和友元运算符函数的比较,双目运算符:成员运算符函数带有一个参数,而友元运算符函数带有两个参数。单目运算符:成员运算符函数不带参数,而友元运算符函数带有一个参数成员运算符函数和友元运算符函数的两种调用方式。,对于双目运算符,将它重载为一个友元运算符函数比重载为成员运算符函数便于使用。若运算符的操作

9、要修改类对象的状态,则选成员运算符函数较好如运算符所需的操作数(尤其是第一个操作数需)希望有隐式类型转换,则必须用友元,+和- -运算符的重载,对前缀方式+ob,可以用运算符函数重载为: ob.operator+();(成员函数)或 operator+(X (友元函数) 调用时参数int一般被传递给值0,class over int i1,i2;public: void init(int I1,int I2)i1=I1;i2=I2; void print()couti1i2”,该类提供了流的大部分输入操作输出流(ostream)针对系统全部的预定义类型重载了输入运算符“num;if(num=0

10、) cerr:双目运算符,有两个操作数,左操作数是istream类的一个对象,右操作数既可以是一个预定义类型的变量,也可以是重载了该运算符的类对象,缺省时:运算符跳过空白符,然后读入与输入变量类型相对应的值。因此,给一组变量输入值时可用空格或换行把键入的数值间隔开。 int n; float x; cinnx;,当输入字符串时:运算符跳过空白符,读入以下的非空白字符,直到遇到另一个空白字符为止,并在串尾放一个字符0。 char *str; cinstr;输入:object programming!则:str=“object”,预定义类型的输入输出,不同类型的变量一起输入时,系统除检查是否含有空

11、白符外,还完成输入数据与变量类型的匹配int n;float x;cinnx;输入:35.78 89.25则:n=35 x=.78,输入运算符采用左结合方式工作,并返回它的左操作数。,预定义类型的输入输出,输出运算符:双目运算符,有两个操作数,左操作数是ostream类的对象,右操作数既可以是一个预定义类型的变量,也可以是重载了该运算符的类对象,运算符:采用左结合方式工作,并且返回它的左操作数。使用进行输出操作时,编译程序根据出现在运算符右边的变量的类型决定调用重载该运算符的哪个版本重载不能改变运算符的优先级cout的重载,:重载格式为 ostream operator(cout ,a),为复

12、数类型重载,#include class complex private: float Re,Im; public: complex(float r=0,float i=0) Re=r;Im=i; friend istream,输入1 2 3 4(注意不能输入1,2,3,4逗号不是间隔),a=?,运算符的重载,istream 相当于为istream类重载输入运算符,格式控制,格式控制方法:使用ios类中有关格式控制的成员函数使用称为控制符的特殊类型函数用ios类成员函数控制格式在ios类中说明了数据成员long x_flags,存放控制输入输出格式的状态标志,每个状态标志占一位。详见p138设

13、定了某个状态标志,则x_flags中对应位为1,否则为0,可以几个标志并存例:对于12.0,如未置showpoint位,则输出12,若置此位,输出12.000000,格式控制,用成员函数操作状态标志,设置状态标志setf,原型:long ios:setf(long flags);使用:stream_obj.setf(ios:scientific);其中:stream_obj多为cin、cout设置多个标志时,彼此用或运算符|分隔例:cout.setf(ios:dec|ios:scientific);,清除状态标志unsetf,原型:long ios:unsetf(long flags);作用:

14、把指定的状态标志位置0,即清除指定的状态标志,取状态标志flags,原型:long ios:flags(); long ios:flags(long flags);作用:取状态标志,操作状态标志的成员函数举例,#include void showflags(long f) long i; for(i=0x8000;i;i=i1) if(i,格式控制,设置域宽,原型:int ios:width();返回当前的域宽值 int ios:width(int wid);设置域宽,并返回原域宽特点:设置的域宽仅对下一个流输出操作有效,当一次输出操作完成后,域宽恢复为0,设置填充字符:当输出值不足以填满域宽

15、时用该字符来填充,原型:char ios:fill();返回当前的填充字符 char ios:fill(char c)用参数c重新设置填充字符, 并返回填充前的字符,设置显示精度,原型:int ios:precision();返回当前的显示精度 int ios:precision(int num)用参数num重新设置显 示精度,并返回设置前的显示精度,上述成员函数举例,#include void main() cout“default width is”cout.width()“n”; cout“default fill is”cout.fill()“n”; cout“default prec

16、ision is”cout.precision()“n”; cout666“ “123.45678“n”; cout.precision(3); cout.width(8); cout666“ “123.45678“ “456.78“n”; cout“current width is”cout.width()“n”; cout“current precision is”cout.precision()“n”; coutfill(*); cout.width(8); cout666“ “123.45678“n”;,default width is0default fill isdefault p

17、recision is6666 123.457 666 123 457current width is0current precision is3*666 123,格式控制,结论:缺省域宽为0;缺省的填充字符为空格;缺省的输出精度为0,即按数据的实际精度输出设置了显示精度后,若数据的实际精度与设置的精度不一致,则输出方法如下:实际精度大于设置精度时,四舍五入后按设置的精度输出;实际精度小于设置的精度时,按实际精度输出设置域宽后,只对其后最接近它的第一个输出有影响,第一个输出完成后系统立即把域宽置0,用控制符控制格式,ios类的成员函数控制输入输出格式时,必须由流对象来调用它们,且不能把它们直接

18、嵌入到输入输出语句中。控制符:类似于函数的运算符。用一个流引用作为参数,并返回同一个流的引用标准控制符:dec:设置十进制转换基格式标志hex:设置十六进制转换基格式标志oct:设置八进制转换基格式标志ws:提取空白字符,仅用于输入endl:插入换行符并刷新流,仅用于输出ends:在串后插入终止空字符,仅用于输出flush:刷新输出流,仅用于输出setbase(int n):设置转换基格式位n(取值0,8,16,10),缺省为0,用控制符控制格式,sesetiosflags(long f):清除由参数f指定的格式位,用于输入输出setfill(int c):设置填充字符,对于右对齐输出,填充左

19、面;对于左对齐输出填充右面。一次设置多次有效。用于输入输出setprecision(int n):设置浮点数精度为n,用于输入输出setw(int n):设置域宽为n,只对下一次的输出操作有效。用于输入输出上述控制符在iostream.h中定义,控制符函数在iomanip.h中定义,使用控制符函数时必须包含这两个头文件,控制符和控制符函数举例,#include #include void main() cout123setw(5)45688“n”; cout123setw(5)setfill(*)456setw(5)88“n”;,123 45688123*456*88,控制符和控制符函数举例,

20、#include #include void main() float v1=1360.53; float v2=300.23; float v3=84430.23; coutsetiosflags(ios:showpoint|ios:fixed)setprecision(2) setfill(*)setiosflags(ios:right); cout“nCheck Value:$ “setw(10)v1; cout“nCheck Value:$ “setw(10)v2; cout“nCheck Value:$ “setw(10)v3;,Check Value:$ *1360.53Check

21、 Value:$ *300.23Check Value:$ *84430.23,用户自定义控制符,用途:当要对预先未定义的设备进行操作时,定义自己的控制函数能使得对这类设备的操作变得方便当多次重复使用几个相同的控制符时,可以把这些控制符合并在一个控制函数中,以便于用户使用为输出流定义控制函数的格式为: ostream 调用时只要直接写出自定义控制符的名字:manip_name,用户自定义控制符,#include #include ostream ,first line:25*second line:148*,文件操作方式,文件:C+把文件当成字符序列。按照数据的组织形式,可把文件分成ASCII

22、文件和二进制文件ASCII文件:每个字节放一个ASCII代码,表示一个字符,使用方便但占用的存储空间较多。缺省时文件以正文方式打开,即在输入时回车/换行序列转换成字符n,输出时字符n转换成回车/换行序列二进制文件:把内存中的数据按其在内存中的存储形式原样写到外存储器中。二进制文件可以节省外存空间,但它的一个字节不对应一个字符打开文件:进行文件的输入输出,首先建立一个文件流,把该流和实际的文件相关联关闭文件:取消文件和流的关联文件流:输入文件流、输出文件流、输入/输出文件流,面向文件的流类,fstream.h:“文件流”头文件,在该文件中对各个文件流类进行了定义,但是没有预定义各自的全局对象。因

23、为,在C+ 中文件类不是标准设备,不能预先定义。在头文件fstream.h中给出了fstreambase、ifstream、ofstream、fstream类的定义。fstreambase是ifstream和ofstream的公共基类,fstream是ifstream和ofstream的派生类,都是公有继承关系 执行文件输入输出前的三件事:在程序中包含头文件fstream.h建立文件流,即说明面向文件流类的对象打开文件,即是使某个文件和某以文件流相关联。(文件名和文件的打开方式是传递给构造函数的实参),创建文件流时,需要使用面向文件的流类的构造函数。每个面向文件的流类都有四个重载的构造函数,?

24、fstream():创建一个未打开的文件流?fstream(const char*,int mode,int prot=filebuf:openprot):创建一个打开的文件流第一个参数指定与此文件流相关联的文件的名字第二个参数mode决定文件的打开方式app:追加数据 ate:文件指针移到文件尾in:以输入方式打开文件 out:以输出方式打开文件binary:二进制方式打开文件 trunc:文件存在清除原有内容nocreate:文件不存在失败 noreplace:文件存在失败第三个参数决定文件的保护方式:0 普通文件;1 只读文件;2 隐含文件;4 系统文件;8 备份文件,面向文件的流类,面

25、向文件的流类,创建ifstream类对象时,缺省的mode值为ios:in;创建ofstream类对象时,缺省的mode值为ios:out;未显式指明以二进制方式打开文件,则缺省的方式为文本方式;,?fstream(int fd):创建一个打开的文件流,并把它链接到文件柄为fd的文件?fstream(int fd,char *buf,int len):创建一个打开的文件流,并把它链接到文件柄为fd的文件close函数:关闭与该流对象相链接的文件,并清除流的错误状态open(const char *name,int mode,int prot=filebuf:openprot)函数:打开名为na

26、me的文件,例:建立一个输入输出文件流both,把它链接到文件data.dat上,并清除原有的文件内容 fstream both; both.open(“data.dat”,ios:in|ios:out|ios:trunc);fstream both(“data.dat”,”ios:in|ios:out|ios:trunc);,文件的读写文本文件,文本文件的读写:使用输入运算符和输出运算符例:把一个整数、浮点数、字符串写到文件data中,#include #include main() ofstream out(“data”); if(!out) cout“can not open file

27、data.”; return 0;out256“ “198.69“ “C+ Languagen”;out.close();return 1;,文件的读写二进制,二进制文件的读写:使用istream类的公有成员函数get(char &)和ostream类的公有成员函数put(char)例:在屏幕上显示任何文件的内容,#include #include main(int argc,char *argv) char ch; ifstream in(argv1); if(!in) cout“Cannot open file”; return 1; while(!in.eof() in.get(ch); coutch; return 0;,流的错误处理,

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。