第十讲模板和I/O流ch10.2让代码进一步复用intadd(inta,intb){returna+b;}floatadd(floata,floatb){returna+b;}doubleadd(doublea,doubleb){returna+b;}此种情况下,函数代码完全一致,所不同的仅仅是数据类型。模板可以实现另一种代码复用机制,它可以实现数据类型的参数化!模板分函数模板和类模板。ch10.3函数模板声明格式:templateclass类型参数返回类型函数名(模板形参表){函数体}前面的例子可以用下面的函数模板实现:templateclassTTadd(Ta,Tb){returna+b;}如何使用函数模板?ch10.4模板函数add(1,2);add(1.1,2.2);templateclassTTadd(Ta,Tb){returna+b;}//函数模板intadd(inta,intb){returna+b;}//模板函数doubleadd(doublea,doubleb){returna+b;}//模板函数根据调用时实参的类型自动实例化未知类型得到一个模板函数,各实参类型必须保持完全一致,不存在隐含的自动类型转换功能。简而言之,add(1,2.2)是个错误的调用。ch10.5类模板和模板类lineinta;linedoubleb;templateclassTclassline{Tlength;voidf();};//类模板templateclassTvoidlineT::f(){}classline{intlength;voidf();};//模板类voidlineint::f(){}classline{doublelength;voidf();};//模板类voidlinedouble::f(){}类模板定义的只是类的一种模式,它本身不是一个实实在在的类,不能由之去定义对象,实例化为一个模板类后才能定义对象。成员函数定义在类外面时注意它的写法I/O流ch10.7基本概念流:与数据传送有关系的事物叫做流,C++用流表示数据的传输操作。流总是与某一设备(如:键盘、屏幕、硬盘、软盘等)相联系。流类:C++为输入/输出定义了一组不同的类(包含要进行传送的数据的结构、属性、特征和行为,都将其放在流库中),叫做流类。流的对象:用流类声明该流类的一个对象,代表某个输入设备或输出设备,并与具体的某个文件相联系,叫做流的对象。输入流:有一种流表示数据从某个载体或设备传送到内存缓冲区变量中,叫做输入流。输出流:有一种流表示数据从内存送到某个载体或设备中,叫做输出流。ch10.8ios类IO缓冲区:一小块系统使用的内存空间,用于暂存输入/输出的数据。streambuf类负责管理这块空间。ios类及其派生类提供用户使用流类的接口,提供了输入和输出所需要的公共操作,它支持对缓冲区进行输入输出时的格式化或非格式化转换。iosistreamostreamiostreamifstreamofstreamistream_withassignostream_withassignch10.9标准I/O流在iostream.h声明了四个预定义流对像externistream_withassigncin//stdinexternostream_withassigncout//stdoutexternostream_withassigncerr//stderrexternostream_withassignclog//stderrwithbuf用户可以使用istream和ostream定义声明自己的流对象ch10.10用户自定义类型的输入输出重载输入运算符的定义格式如下:istream&operator(istream&in,user_type&obj){inobj.item1;inobj.item2;inobj.item3;//…returnin;}重载输出运算符的定义格式如下:ostream&operator(ostream&out,user_type&obj){outobj.item1;outobj.item2;outobj.item3;//…returnout;}ch10.11文件的组织形式二进制型把内存中的数据按存储形式原样写到磁盘上存放。文本型(字符型)在文件中存放的是字符的ASCII码,一个字符占用一个字节。读取文本文件时,系统会每次读8位二进制组成一个字节后再翻译成ASCII码。C++认为文件就是一个字符流或二进制流,数据与数据之间没有边界。这种文件称为流式文件。ch10.12文件的打开与关闭在C++中,打开一个文件,就是将这个文件与一个流建立关联;关闭一个文件,就是取消这种关联。C++有三种类型的文件流:输入文件流ifstream、输出文件流ofstream、输入/输出文件流fstream。类定义在fstream.h中。打开文件的步骤如下:包含头文件fstream.h建立流对象ifstreamin;//输入流对象inofstreamout;//输出流对象outfsteamboth;//输入/输出流对象both使用open()函数打开文件ch10.13文件的打开与关闭(续)voidopen(constchar*,int,int=filebuf::openprot);第一个形参用于传递文件名第二个形参决定文件打开的方式ios::in=0x01ios::out=0x02ios::nocreate=0x20ios::noreplace=0x40ios::binary=0x80第三个形参决定文件的访问方式,默认值为openprot文件的关闭:close();//请养成关闭文件流的习惯ch10.14文件的读写对于文本文件,打开之后,可以直接使用运算符“”和“”进行写和读,仅需将流文件对象替换cin或cout即可。对于二进制文件,使用read()和write()函数进行读写。istream&read(unsignedchar*buf,intnum)ostream&write(constunsignedchar*buf,intnum)指针buf指向一块缓冲区空间,可能需要程序员手工创建,num指定要读/写的字节数。ch10.15后续安排答疑及考试时间另行通知!答疑时交实验四报告4.9(周三)4.12(第7周,周六)4.19(第8周,周六)总复习下午2:00开始晚6:30-9:00实验三下午1:30-4:30实验四交实验一和二的报告交实验三报告Theend.Thanks!