您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > c++面向对象课后答案第11章
1.概念填空题1.1C++程序将可能发生异常的程序块放在try中,紧跟其后可放置若干个对应的catch,在前面所说的块中或块所调用的函数中应该有对应的throw,由它在不正常时抛出异常,如与某一条catch类型相匹配,则执行该语句。该语句执行完之后,如未退出程序,则执行catch后续语句。如没有匹配的语句,则交给C++标准库中的termanite处理。1.2throw表达式的行为有些像函数的函数调用,而catch子句则有些像函数的函数定义。函数的调用和异常处理的主要区别在于:建立函数调用所需的信息在编译时已经获得,而异常处理机制要求运行时的支撑。对于函数,编译器知道在哪个调用点上函数被真正调用;而对于异常处理,异常是随机发生的,并沿调用链逆向查找异常处理子句,这与运行时的多态是不一样的。2.简答题2.1C++中的异常处理机制意义,作用是什么?2.2当在try块中抛出异常后,程序最后是否回到try块中继续执行后面的语句?2.3什么叫抛出异常?catch可以获取什么异常参数?是根据异常参数的类型还是根据参数的值处理异常?请编写测试程序验证。2.4为什么C++要求资源的取得放在构造函数中,而资源的释放在析构函数中?3.选择题3.l下列关于异常的叙述错误的是(A)。A.编译错属于异常,可以抛出B.运行错属于异常C.硬件故障也可当异常抛出D.只要是编程者认为是异常的都可当异常抛出3.2下列叙述错误的是()。A.throw语句须书写在时语句块中B.throw语句必须在try语句块中直接运行或通过调用函数运行C.一个程序中可以有try语句而没有throw语句D.throw语句抛出的异常可以不被捕获3.3关于函数声明floatfun(inta,intb)throw,下列叙述正确的是()。A.表明函数抛出float类型异常B.表明函数抛出任何类型异常C.表明函数不抛出任何类型异常D.表明函数实际抛出的异常3.4下列叙述错误的是()。A.catch(…)语句可捕获所有类型的异常B.一个try语句可以有多个catch语句C.catch(…)语句可以放在catch语句组的中间D.程序中try语句与catch语句是一个整体,缺一不可3.5下列程序运行结果为(A)。#includeiostreamusingnamespacestd;classS{public:~S(){cout”S””\t”;}};charfun0(){Ss1;throw(‘T’);return‘0’;}voidmain(){try{coutfun0()”\t”;}catch(charc){coutc”\t”;}}A.STB.OSTC.OTD.T4.写出程序运行结果4.1#includeiostreamusingnamespacestd;inta[10]={1,2,3,4,5,6,7,8,9,10};intfun(inti);voidmain(){inti,s=0;for(i=0;i=10;i++){try{s=s+fun(i);}catch(int){cout”数组下标越界!”endl;}}couts=”sendl;}intfun(inti){if(i=10)throwi;returna[i];}数组下标越界!S=554.2#includeiostreamusingnamespacestd;voidf();classT{public:T(){coutconstructorendl;try{throwexception;}catch(char*){coutexception”endl;}throwexception;}~T(){coutdestructor;}};voidmain(){coutmainfunction”endl;try{f();}catch(char*){coutexception2endl;}coutmainfunction”endl;}voidf(){Tt;}mainfunctionconstructorexceptionexception2mainfunction5.程序设计题5.1以String类为例,在String类的构造函数中使用new分配内存。如果操作不成功,则用try语句触发一个char类型异常,用catch语句捕获该异常。同时将异常处理机制与其他处理方式对内存分配失败这一异常进行处理对比,体会异常处理机制的优点。#includeiostream#includecstringusingnamespacestd;classString{public:String(constchar*);String(constString&);~String();voidShowStr(){coutsPtrendl;}private:char*sPtr;};String::String(constchar*s){sPtr=newchar[strlen(s)+1];if(sPtr==NULL)throw(Constructorabnormal);strcpy(sPtr,s);}String::String(constString©){sPtr=newchar[strlen(copy.sPtr)+1];if(sPtr==NULL)throw(Copyconstructorabnormal);strcpy(sPtr,copy.sPtr);}String::~String(){delete[]sPtr;}intmain(){try{Stringstr1(ThisisC++);Stringstr2(str1);}catch(char*c){coutcendl;}return0;}5.2在5.1的基础上,重载数组下标操作符[],使之具有判断与处理下标越界功能。解法一#includeiostream#includecstringusingnamespacestd;classString{public:String(constchar*);String(constString&);~String();charoperator[](int);voidShowStr(){coutsPtrendl;}private:char*sPtr;};String::String(constchar*s){sPtr=newchar[strlen(s)+1];if(sPtr==NULL)throw(Constructorabnormal);strcpy(sPtr,s);}String::String(constString©){sPtr=newchar[strlen(copy.sPtr)+1];if(sPtr==NULL)throw(Copyconstructorabnormal);strcpy(sPtr,copy.sPtr);}String::~String(){delete[]sPtr;}charString::operator[](intsubscript){if(subscript0||subscriptstrlen(sPtr))throw(subscript);return*(sPtr+subscript);}intmain(){try{Stringstr1(ThisisC++);Stringstr2(str1);coutstr1[3]endl;coutstr2[18]endl;}catch(char*c){coutcendl;}catch(inti){couti下标越界endl;}return0;}解法二#includeiostream#includecstring#includestdexceptusingnamespacestd;classString{public:String(constchar*);String(constString&);~String();charoperator[](int);voidShowStr(){coutsPtrendl;}private:char*sPtr;};String::String(constchar*s){sPtr=newchar[strlen(s)+1];if(sPtr==NULL)throw(Constructorabnormal);strcpy(sPtr,s);}String::String(constString©){sPtr=newchar[strlen(copy.sPtr)+1];if(sPtr==NULL)throw(Copyconstructorabnormal);strcpy(sPtr,copy.sPtr);}String::~String(){delete[]sPtr;}charString::operator[](intsubscript){if(subscript0||subscriptstrlen(sPtr)){char*out_of_index=Outofrangeinindexofarray;throw(out_of_index);}return*(sPtr+subscript);}intmain(){try{Stringstr1(ThisisC++);Stringstr2(str1);coutstr1[3]endl;coutstr2[18]endl;}catch(char*c){coutcendl;}catch(out_of_range&excp){coutexcp.what()endl;return-1;}return0;}5.3定义一个异常类Cexception,有成员函数reason(),用来显示异常的类型。定义一个函数fun1()触发异常,在主函数try模块中调用fun1(),在catch模块中捕获异常,观察程序执行流程。#includeiostreamusingnamespacestd;enum{EXCEPTION_1=1,EXCEPTION_2,EXCEPTION_3};classCException{public:CException(intnReason){m_nReason=nReason;}~CException(){}voidReason(){coutException:m_nReasonendl;}private:intm_nReason;};voidfn1(){thrownewCException(EXCEPTION_1);}intmain(){try{fn1();}catch(CException*e){e-Reason();}return0;}
本文标题:c++面向对象课后答案第11章
链接地址:https://www.777doc.com/doc-5410381 .html