流类法与输入输出
1. 如何理解流的概念? 流的插入和提取指的是什么?
解:
在C++中,输入输出是通过流来完成的。所谓“流”是指数据从一个位置到另一个位置的流动抽象为“流”。当数据从键盘流到C++程序中时,这样的流称为“输入流”(或提取),而当数据从程序中流向屏幕或键盘时,这样的流称为“输出流”(或插入)。操作系统是将键盘、屏幕、打印机等作为一种扩充文件来处理,I/O流类负责与这些扩充文件交互信息,实现数据的输入和输出。
2. 标准输入流中的cout,cerr,clog,cin 作用是什么?有何区别?
解:
C++提供了4个预定义的标准流对象:cin、cout、cerr和clog。当用户在程序中包含了头文件“iostream.h”时,编译器调用相应的构造函数,长生四个标准流对象,用于处理标准输入,即键盘输入;cout是ostream类的对象,用于处理标准输出,即屏幕输出;而cerr和clog都是ostream类的对象,用来处理标准出错信息,并将信息显示在屏幕上。在这四个标准流对象中,除了cerr不支持缓冲外,其余3个都有缓冲区。
3.写出下列程序的输出结果。
4.假设有一个文件f1.txt ,编写程序主文件f2.txt ,将f1.txt 中所内容拷贝到f2.txt 中。(VC++教程 p147)
5.有一个字符串“1 2 3 4 5 6 7 8 9 10 ” 存放在字符数组中,中间以空格分隔。要求以10个整数形式将其取出,存放另一个整型数组,然后输出。
6.重载提取(>>)和插入(<<)运算符,使其可以实现对Point类的对象的输入和输出,并利用重载后的运算符,从键盘读入点坐标,写到磁盘文件Point.txt中。
7.已知磁盘文件file1中的内容为一组字母“a c b k l i j h f x s”,磁盘文件file2中的内容为一组字母“d p o m n w e r v u”,把两个文件的字母按顺序排列后,存入新文件file3中。
8.采用什么方法打开和关闭磁盘文件?
9.写磁盘文件有哪几种方法?读磁盘文件时有那几种方法。
10.设计一个学生类Cstudent,包含数据成员:姓名,学号,一门课成绩。创建5个对象并将5个学生记录存入文件Sfile中,然后移动文件指针,读取相应记录,将读取的每一条记录都输出到屏幕上。 (VC教程p148)
4.定义一个具有数组性质的类,对流类重载运算“[ ]”实现数组元素的访问。要求在操作符“[ ]”重载函数中对下标进行检查,越界时抛掷一个异常对象。
5.读程序“C++程序设计教程” p299
6.修改习题4 。设计一个数组尺寸异常类,在数组类的构造函数中如果发现数组尺寸不符,则抛出一个Size异常对象。
7.举例说 try ,throw 和 catch的用法。
8.定义一个堆栈类(如例5-19),利用异常类的派生类数组处理栈的上溢(overflow)和下溢(underflow).
实验:用枚举组织处理多个异常。
enum Matherr{overflow,underflow,zerodinide …}
P280(C++程序设计教程)
习题8
class Error
{ };
class overflow : public Error
{ };
1. 什么是异常?什么是异常处理?
在编写程序时,总是会不可避免的遇到一些问题。尤其是在设计一个类时。总要包含一些错误处理。同时,由于面向对象提倡的可重用性,同一个类不仅类的书写者要用,其他人也可以用,这就要求类中的错误处理应该考虑到不同的使用者的需要,一般可能直接中止。C++提供了异常处理机制,它把错误检查和错误处理分开;如类专门检查各种可能出现的错误,类的使用者则提供具体的错误处理程序。
C++提供了三个关键类来对异常进行处理:
try:可能抛出异常的程序段必学以try开始。
throw:异常要通过关键类throw抛出。
Catch:处理异常的程序必须以catch开始。
3. C++异常处理有哪些特点?
异常处理的思路是:发现错误的函数可以不具有错误处理的能力。这个函数会引发一个异常,希望它的调用者能捕获这个异常并处理这个错误。如果调用者也不能处理这个错误,还可以连续给上调者和处理,这种传播会一直继续到异常被处理为止。这样低层的函数可以着重解决具体问题。上层调用者来考虑对不同的异常进行相应的处理。
4. 举例说明异常关键类try ,throw 和 catch 的用法。
异常处理的语法:
throw 表达式 //抛出异常
try块:
try 复合语句
catch (异常类型声明)
复合语句
catch (异常类型声明)
复合语句
…
必须使用try语句来捕获异常。在执行try后的复合语句中或在一个函数调用中出现异常。它总是跟在一个try程序块后面处理try程序块产生的异常。
例如:
try{
int m=n;
cin>>dis>>n;
if(n==0)
throw n;
cout<<"m/n"<<m/n;
}
catch (int)
{cout<<"error of devary zero/n";}
3.C++异常处理中怎样处理够造与析构的关系?
C++异常处理的正真能力,不仅在于它能够处理不同类型的异常,同时它具有异常抛掷前构造的所有局部对象自动释放的能力。程序中如果在try块中定义了类对象,当出现异常时,从try块开始到抛出异常之间构造的所有自动对象进行析构,析构的顺序与构造的顺序相反。