C++ how to programdata 第八版

@C++使用类型安全的I/O,任何一次I/O都是对数据类型敏感的。
@用户可以通过重载流运算符来实现对用户自定义类型的I/O操作,这种扩展很拉风。
@C++的I/O是以一连串的字节流的方式进行的。
@C++同时提供低层次的和高层次的I/O。低层次的I/O即是非格式化的I/O,指定字节从设备流向内存或者从内存流向设备,
&这种传输速度快,针对字节,但不方便,非格式化的I/O,也就是高层次的I/O,字节被组成有意义的字符,方便。
@使用非格式化的I/O可能会导致移植问题,因为是基于字节。
@绝大多数C++程序包含&iostream&该头文件声明了所有I/O操作所需的基础服务,此文件中定义了cin(标准输入),
cout(标准输出),cerr(无缓冲的标准错误流),clog(有缓冲的标准错误流)
@&iomanip&头文件中声明了对于带有参数化流运算符的格式化和非格式化的服务,就是带有参数的流运算符,跟函数差不多的形式,
不带参数的流运算符不用添加这个头文件。
@对于文件的I/O,添加&fstream&
@&iostream&提供了很多类模板来处理I/O操作,例如basic_istream(处理输入操作),basic_ostream(支持输出操作),basic_iostream(都支持)
当然,那样用起来麻烦些,在iostream中使用typedef定义了其别名,istream,ostream,iostream。
@注意typedef只是创建了一个名字,并没有创建别名。
@cerr是一个ostream实例,被连接到标准错误设备,对象cerr的输出是无缓冲的,这意味着每个针对cerr的输出必须被立即显示。
@clog是一个ostream实例,被连接到标准错误设备,clog的输出是有缓冲的,这表示每个针对clog的流将被保存到缓冲区,直到缓冲区被填满或被清空才输出。
@ 输出大体包括
&&&& 1,使用流插入运算符执行标准数据类型的输出。
&&&& 2,使用put成员函数进行字符输出
&&&& 3,通过write函数进行非格式化输出
&&&& 4,十进制,八进制,十六进制的输出
&&&& 5,不同精确度的浮点数输出
&&&& 6,指定域宽的输出
&&&& 7,带有特殊填充字符的输出
&&&& 8,科学计数或带有十六进制符号的输出
@c++能自动判定类型,所以会自动把char×当作以空字符结尾的字符串,而如果要打印其首地址怎么办?,解决办法就是强制把char×转换成void×,如果程序员想输出一个地址,都必须这样办。&&&&
&&&&&& const char × const word =“hello”;
&&&&&& cout&&
&&&&&& cout&&static_cast&void*&(word);
@可以使用cout的成员函数put输出单个字符,cout.put('A‘);cout.put('A‘).put(’\n‘);&&&&
&&& 1, 没有实参的get函数返回一个字符(包括空白字符等)
&&& 2,eof函数用来判断cin流是否读到文件尾。
&&&&&&&&&& while(charac=cin.get()!=EOF)
&&&&&&&&&&&&&&&& cout.put(charac);
&&& 3,带有一个参数的get函数,将把读入的字符存储在参数中。
&&& 4,含有3个参数的get函数,第一个是一个字符数组,第二个是一个长度,第三个是分隔符,注意:在读取时遇到分隔符,
&&&&&&&&& 读取终止后分隔符没有被放入到数组,而是仍旧在输入流中,默认的分隔符是\n,读取的最大字符是n-1,因为最后一个要是空字符。
&&&& 例子cin.get(buffer,size);
&&& 5,getline与有三个参数的get类似,但是会从输入流中移除分隔符,没有放在字符数组中。&&
&&& 6,函数ignore或者是读取并丢弃一定数量的字符,或者是遇到指定分隔符时停止(默认是EOF)
&&& 7,putback将先前用get获取的字符再放回到输入流中(最前面,下一个将读到的字符)
&&& 8,peek将返回输入流中的下一个字符,但不将它从输入流中丢弃。&&&
&&&&&&&&&&&&&&&&
@非格式化的读入和输出。
&& 读入使用cin.read,输出使用cout.write,read将一定数量的字节读入到数组中,这些字节没有经过任何格式化。
&&& char buffer[]=“hello world&;
&&& cout.write(buffer,6);
&&& 输出buffer的前6个字符。
&& read将指定数量的字符读入到字符数组中,当读取的字符数量少于指定数量时,failbit将被设置。
&& 成员函数gcount返回最近一次操作读取的字符。
&&& char buffer[80];
&&& cin.read(buffer,40);
&&& cout.write(buffer,cin.gcount());
@ 流操作符, 设置域宽,设置精度,十六进制,八进制等,注意有参数的流操作符要加头文件&iomanip&
&& 1,进制
&&&& cout&&dec&&integer;
&&&& cout&&hex&&integer;
&&&& cout&&oct&&integer;
&&&& 也可以通过setbase,setbase(16);直观方便。
&&&& cout&&setbase(16)&&integer;
&& 2,浮点进度
&&&& 可以使用setprecision(n)流运算符,或者ios_base的precision来控制精度,这两个都是有粘性的(影响后面所有的输出)
&&&& 注意在使用之前,加上cout&&fixed;以表示使用定点格式。
&&&& cout&&setprecision(n)&&doubleNumber;
&&&& cout.precision(3);
&&&& cout&&doubleNumber;
&&&& for(int i=0;i&10;i++)
&&&&& cout&&setprecision(i)&&doubleNumber;
&& 3,域宽
&&&& 成员函数width可以设置域宽(ios_base)并返回原来的域宽,域宽不是粘性的,不会影响下一个输出,setw流操作符也可以用来设置域宽。
&&&& 注意:当向一个char字符数组输入数据时,读入的最大字符数将小于制定域宽的字符,因为必须在输入的字符串中插入空字符。
&&&& cin.width(5);
&&&& while(cin&&array)
&&&&&&&& cout.width(n++);
&&&&&&&& cout&&
&&&&&&&& cin.width(5);
&&&&&& 程序员可以创建自己的流操作符,例如下面创建的4个流操作符。(对于输出流操作符来说,它的返回类型和参数都必须是ostream&
&&&&&& ostream& bell(ostream& output)
&&&&&&&& return output&&'\a';
&&&&&& ostream& munipulator(ostream& output)
&&&&&&& return output&&‘\a';
&&&&&& ostream& tab(ostream& output)
&&&&&&& return output&&'\t';
&&&&&& ostream& endLine(ostream& output)
&&&&&&& return output&&'\n'&&
&&&&&&&&&&&&&
&@流的格式状态和流操作符
& 1,流操作符showpoint强制要求浮点数的输出必须带小数点和尾数0
&&&& 可以使用noshowpoint重置。
&&&& cout&&showpoint&&9.00;
&&&& cout&&noshowpoint;
&&&& 使用left,right流操作符对齐,通常与setw,width一起使用。
&&&& 刘操作副internal表示数字的符好左对齐,数字右对齐,中间部分可以使用填充,注意可以使用showpos强制输出正数的&+&;
&&&& fill成员函数通常用来对对齐域进行填充,相同的还有setfill流运算符
&&&& 注意看下面的区别
&&&& cout.fill(‘×’);
&&&& cout&&setw(10)&&&heh&;
&&&& cout&&internal&&setw(10)&&setfill('&')&&hex&&integer;
& 3,showbase与dec,hex,oct使用时可以以10,16,8进制形式显示数字
&&&&& cout&&showbase;
&&&&& cout&&integer;
&&&&& cout&&hex&&integer;
&&&&& cout&&oct&&integer;
& 4,scientific以科学计数发现是,fixed以指定格式小数显示,默认6位。
& 5,uppercase,以大写显示,取消使用nouppercase
&&& cout&&uppercase&&4。34e10&&endl&&hex&&showbase&&123456;
& 6,布尔格式。
&&& 默认输出布尔格式是0或1,可以使用流运算符boolalpha设置流以字符串形式显示bool值,可以使用noboolalpha取消。
&&& cout&&bool;
&&& cout&&boolalpha&&bool;
&@恢复状态
&& 以上是怎样设置格式状态,假设要恢复到以前的状态需要两个内容。
&& 1,需要ios_base里的成员类型fmtflags,这里面保存格式的状态信息。
&& 2,cout的函数flags,这个函数有两种情况,没有参数时返回当前的输出格式状态,有 fmtflags类型变量做参数时,就恢复到这个参数标识的状态。
&& 例子:ios_base::fmtflags fmtOriginal=cout.flags();
&&&&&&&& 这将保存当前的状态。
&&&&&&&& cout.flags(fmtOriginal);
&&&&&&&& 这将恢复到以前的状态。
&@流的状态可以通过ios_base中的位来判断,这些位对应着函数如下
&&&&&& 1,当输入流遇到文件尾时,eofbit将被设置,当流试图越过末尾提取数据时,可以调用成员函数eof来判断是否到了末尾。
&&&&&&&&& cin.eof();
&&&&&& 2,遇到文件末尾时返回true,否则false
&&&&&& 3,当发生格式错误时候failbit将被设置
&&&&&&&&& 对应函数为fail()
&&&&&& 4,当发生数据丢失错误时badbit将被设置
&&&&&&&&& 对应函数bad()
&&&&&& 5,如果eof,bad,fail位都没有被设置,则goodbit被设置,表示读取正常
&&&&&& 6, 函数rdstate返回流的错误状态,例如可以通过rdstate()读取状态,然后用switch语句检测各个位的状态
&&&&&& 7,首选使用对应函数检测,不需要了解各个位的位置。
&&&&&& 8, clear成员函数将重置状态为好的
&&&&&&&& 例如cin.clear()清空了cin,并且将该流设置goodbit位
&&&&&&&& cin.clear(ios::failbit);将设置failbit位
&&&&&& 9,如果badbit或者failbit被设置,则ios的成员函数operator!将会返回true,而operator void*将会返回false,这些在文件处理中很有用。
&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&
&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15343次
排名:千里之外
原创:25篇
(1)(1)(1)(6)(1)(7)(8)(6)(1)这部分涉及类,鉴于C++ how to program在代码规范方面做得不错,所以以代码的形式进行说明
首先注意预处理器封套的使用,所谓的预处理器封套就是宏判断的使用, #ifdef& #else #endif,以防止头文件的重复引用,从而避免出现函数等的重复定义。
C++ how to program开始就提倡接口和实现分离的代码管理方式,下面我们以Time类说明。
添加一个Time.h头文件
&&&&&&&& #ifndef TIME_H
&&&&&&&& #define TIME_H
&&&&&&&&&& class Time
&&&&&&&&&& {
&&&&&&&&&&&&& public:
&&&&&&&&&&&&&&&&&&&&& Time();
&&&&&&&&&&&&&&&&&&&&& void setTime(int ,int, int );
&&&&&&&&&&&&&&&&&&&&& void printUniversal();
&&&&&&&&&&&&&&&&&&&&& void printStandard();
&&&&&&&&&&&&& private:
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&& }
&&&&&&&& #endif
&以上部分就是接口部分,将函数的具体实现屏蔽起来,前面曾提到在函数声明的地方就实现的函数都是内联函数,所以如果函数在上面的声明处直接写出实现代码,就是内联函数。
&下面是实现代码,注意要包含Time.h头文件,否则无法使用Time类域符号“Time”
&#include&iostream&
&#include&iomanip&
&#include&Time.h&
&Time::Time()
&&& hour=minute=second=0;
&void Time::setTime(int h, int m, int s)
&&& hour=(h&=0&&h&24)?h:0;
&&& minute=(m&=0&&m&60)?m:0;
&&& second=(s&=0&&s&60)?s:0;
&void Time::printUniversal()
&&& cout&&setfill('0')&&setw(2)&&hour&&&:&&&setw(2)&&minute&&&:&&&setw(2)&&
&void Time::printStandard()
&&& cout&&((hour==0||hour==12)?12:hour%12)&&&:&&&setfill('0')&&setw(2)&&minute&&&:&&&setw(2)&&second&&(hour&12?&am&:&pm&);
&&& 注意以上代码中构造函数对属性的初始化,以保证对象以一个可靠的状态开始,setfill()函数的使用为当输出域宽大于字符个数时,设置填充符,setfill是粘性的,
&&& 设置一次,对后续的输出都产生作用,而setw是非粘性的,设置一次,只对紧贴着的后面输出有作用。
&&& @请注意:编译器保留不对任何函数内联调用的权利。
&&& 下面是客户代码:
&&& #include&iostream&
&&& #include &Time.h&
&&& int main()
&&&&& cout&&&The& unitial universal time is:&;
&&&&& t.printUniversal();
&&&&& cout&&&\nThe initial stard time is:&;
&&&&& t.printStandard();
&&&&& t.setTime(13,27,6);
&&&&& cout&&&\nuniversal time after setTime is:&;
&&&&& t.printUniversal();
&&&&& cout&&&\nstard time after setTime is:&;
&&&&& t.printStandard();
&&&&& t.setTime(99,99,99);
&&&&& cout&&&\nAfter attempting invalid settings:&;
&&&&& t.printUniversal();
&&&&& t.printStandard();
&&& 类的数据成员和成员函数属于该类的作用域。在类的作用域内,类的成员可以被类的所有成员函数直接访问。,在类的作用域之外,
&&& public类成员函数通过对象(名字,指针,对象引用)引用。
&&& 下面的代码使用三种方式对对象成员操作:
&&& #include&iostream&
&&& class Count
&&&&& public:
&&&&&&&&&&& void setX(int value)
&&&&&&&&&&& {
&&&&&&&&&&&&& x=
&&&&&&&&&&& }
&&&&&&&&&&& void print()
&&&&&&&&&&& {
&&&&&&&&&&&
&&&&&&&&&&& cout&&x&&
&&&&&&&&&&& }
&&&&& private:
&&&&&&&&&&
&&&&&&&&&&&&&&&&&
&&& int main()
&&&&&& Count *countPtr=&
&&&&&& Count &countRef=
&&&&&& cout&&&Set x to 1 and print using the object's name:&;
&&&&&& count.setX(1);
&&&&&& count.print();
&&&&&& cout&&&Set x to 2 and print using a reference to an object:&;
&&&&&& countRef.setX(2);
&&&&&& countRef.print();
&&&&&& cout&&&Set x to 3 and print using a pointer to an object:&;
&&&&&& countPtr-&setX(3);
&&&&&& countPtr-&print();
& @构造函数可以调用类的其他成员函数,这都知道。但是构造函数运行阶段这在初始化对象,
& 数据成员可能还处于不可靠状态,所以一定要注意数据成员的初始化,至少在初始化之后再调用安全一些。
& @当对象撤销时,析构函数就会隐式调用,注意析构函数并不释放对象的内存空间,只是在系统回收对象内存空间之前做前期扫尾工作,这样内存就可以保存新的对象。
& @析构函数不接受任何参数,也不返回任何值,一个类只能有一个析构函数,析构函数不允许重载,必须为public。
& @如果程序员没有提供析构函数,那么系统将默认生成一个空的析构函数。
& @一般而言,析构函数的调用顺序与构造函数刚好相反,但是对象的存储类别可以改变调用析构函数的顺序。
& @全局作用域定义的对象的构造函数,在文件中其它函数开始之前调用,当main函数执行结束时,相应的析构函数被调用,当然exit函数可以迫使程序立即结束,而不执行析构函数。
& @当程序检测到输入错误,或者要处理的文件打不开时,常用exit。
& 下面以代码的形式看一下构造函数和析构函数的执行顺序:
& 接口部分:
& //CreateAndDestroy.h
& #include&string&
& #ifndef CREATE_H
& #define CREATE_H
& class CreateAndDestroy
&&&& public:
&&&&&&&& CreateAndDestroy(int , string);
&&&&&&&& ~CreateAndDestroy()
&&&& private:
&&&&&&&& int objectID;
&&&&&&&&&&&
& 实现部分:
& #include&iostream&
& #include &CreateAndDestroy.h&
& CreateAndDestroy::CreateAndDestroy(int ID,string messageString)
&&& objectID=ID;
&&& message=messageS
& CreateAndDestroy::~CreateAndDestroy()
&&& cout&&(objectID==1||objectID==6?&\n&:&&);
&&& cout&&&Object &&&objectID&&& destroy runs &&&message&&
& 客户代码:
&& #include&iostream&
&& #include &CreateAndDestroy.h&
& CreateAndDestroy first(1,&(global before main)&);& //构造函数中,第一个执行
& int main()
&&& cout&&&\nMAIN FUNCTION:EXECUTION BEGINS&&&
&&& CreateAndDestroy second(2,&(local automation in main)&);
&&& static CreateAndDestroy third(3,&(local static in main)&);
&&& create();
&&& cout&&&\nMAIN FUNCTION:EXECUTION RESUMES&&&
&&& static CreateAndDestroy fourth(3,&(local automatic in main)&);
&&& cout&&&\nMAIN FUNCTION:EXECUTION ENDS&&&
& void create(void)
&&&& cout&&&\nCREATE FUNCTION:EXECUTION BEGINS&&&
&&&& CreateAndDestroy fifth(5,&(local automation in create)&);
&&&& static CreateAndDestroy sixth(6,&(local static in create)&);
&&&& CreateAndDestroy seventh(7,&(local automation in create)&);
&&&& cout&&&\CREATE FUNCTION:EXECUTION ENDS&&&
&@ static局部对象的构造函数只调用一次,而相应的析构函数调用发生在main函数结束或者程序调用exit时,全局或者static对象的撤销顺序与他们的创建顺序正好相反,如果用abort终止程序,静态的析构函数不被调用。
&@难道是静态的不执行,动态的执行?而exit全部不执行?此处不确定。
& 对以上的解析:
& 首先first是全局对象,构造函数第一个被调用,同时析构函数最后一个被调用。
& 所以框架为:
&&&&&&&&&&&& first构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& 中间。。。
&&&&&&&&&&&&
&&&&&&&&&&&& first析构函数
&&&&&&&&&&&&
&其次main中按顺序second和third的构造函数被调用:
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&& first构造函数
&&&&&&&&&&&& second构造函数
&&&&&&&&&&&& third构造函数
&&&&&&&&&&&& 中间。。。
&&&&&&&&&&&
&&&&&&&&&&&& first析构函数
&执行到create函数,fifth,sixth,seventh构造函数被调用
&&&&&&&&&&&&
&&&&&&&&&&&& first构造函数
&&&&&&&&&&&& second构造函数
&&&&&&&&&&&& third构造函数
&&&&&&&&&&&& fifth构造函数
&&&&&&&&&&&& sixth构造函数
&&&&&&&&&&&& seventh构造函数
&&&&&&&&&&&& 中间。。。
&&&&&&&&&&&
&&&&&&&&&&&& first析构函数&&&
&&&&&&&&&&&&
&create函数结束时,create函数中的自动对象的析构函数被调用,切顺序相反,所以
&&&&&&&&&&&&
&&&&&&&&&&&& first构造函数
&&&&&&&&&&&& second构造函数
&&&&&&&&&&&& third构造函数
&&&&&&&&&&&& fifth构造函数
&&&&&&&&&&&& sixth构造函数
&&&&&&&&&&&& seventh构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& seventh析构函数
&&&&&&&&&&&& fifth析构函数
&&&&&&&&&&&& 中间。。。
&&&&&&&&&&&
&&&&&&&&&&&& first析构函数
接着执行到fourth,fourth的构造函数被创建
&&&&&&&&&&&&&
&&&&&&&&&&&&& first构造函数
&&&&&&&&&&&& second构造函数
&&&&&&&&&&&& third构造函数
&&&&&&&&&&&& fifth构造函数
&&&&&&&&&&&& sixth构造函数
&&&&&&&&&&&& seventh构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& seventh析构函数
&&&&&&&&&&&& fifth析构函数
&&&&&&&&&&&&
&&&&&&&&&&&& fourth构造函数
&&&&&&&&&&&& 中间。。。
&&&&&&&&&&&
&&&&&&&&&&&& first析构函数
&&&&&&&&&&&&
执行到main结束,析构函数开始执行,首先是main中动态的对象析构函数被按对象创建相反的顺序执行
&&&&&&&&&&&& first构造函数
&&&&&&&&&&&& second构造函数
&&&&&&&&&&&& third构造函数
&&&&&&&&&&&& fifth构造函数
&&&&&&&&&&&& sixth构造函数
&&&&&&&&&&&& seventh构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& seventh析构函数
&&&&&&&&&&&& fifth析构函数
&&&&&&&&&&&&
&&&&&&&&&&&& fourth构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& fourth析构函数
&&&&&&&&&&&& second析构函数
&&&&&&&&&&&& 中间。。。
&&&&&&&&&&&
&&&&&&&&&&&& first析构函数
&接着静态对象按照被创建的早晚顺序相反执行,显示create函数中的局部静态对象sixth,再是main中的third
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&& first构造函数
&&&&&&&&&&&& second构造函数
&&&&&&&&&&&& third构造函数
&&&&&&&&&&&& fifth构造函数
&&&&&&&&&&&& sixth构造函数
&&&&&&&&&&&& seventh构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& seventh析构函数
&&&&&&&&&&&& fifth析构函数
&&&&&&&&&&&&
&&&&&&&&&&&& fourth构造函数
&&&&&&&&&&&&
&&&&&&&&&&&& fourth析构函数
&&&&&&&&&&&& second析构函数
&&&&&&&&&&&& sixth析构函数
&&&&&&&&&&&& third析构函数
&&&&&&&&&&&
&&&&&&&&&&&& first析构函数
&&&&&&&&&&&&
&这就是完整的构造/析构函数执行顺序。&&&&&&&&&&&
& @关于引用,c++涉及存在严重缺陷,比如你可以在函数中返回对private成员的引用,这是很操蛋的缺陷,所以应该坚决杜绝返回private成员,避免外部直接引用修改。
& @对象可以作为函数实参和返回进行操作,这没啥好说的,但是这种传递和返回默认是以传值的方式进行的。
& @按值传递效率低,按引用传递安全性低,于是const出现了,按常量引用传递。
& @相同类型的对象间可以直接赋值,数据成员会对应彼此赋值,但是当数据成员中包含有指向动态分配内存的指针时,可能会引发严重的问题,这将在后面讲到。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:15344次
排名:千里之外
原创:25篇
(1)(1)(1)(6)(1)(7)(8)(6)(1)Cpp.How.to.Program,8th.Edition 答案(源代码) - 下载频道
- CSDN.NET
&&&&Cpp.How.to.Program,8th.Edition 答案(源代码)
Cpp.How.to.Program,8th.Edition 答案(源代码)
C++大学教程(C++ How to program 第八版)的答案(源代码),自学者必备。第八版时目前的最新版,世界上最权威的C++教材之一,很多重点大学都一次为高级语言程序设计的教材。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
您可能还需要
课程资源下载排行您现在的位置: &
C?How?to?Program(课本中文版)
C?How?to?Program(课本中文版)
国际经典程序设计教程 本资料共包含以下附件: C How to Program(课本中文版).pdf
(本资料免费下载)
&&&主编推荐
&&&热门试卷
&&&最新视频
&&&热门阅读
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-

我要回帖

更多关于 program 的文章

 

随机推荐