程序设计第14章_第1页
程序设计第14章_第2页
程序设计第14章_第3页
程序设计第14章_第4页
程序设计第14章_第5页
已阅读5页,还剩56页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在C++发展的后期,时C++编译系统根据实际工作的需要,增加了一些功能,作为工具来使用,其中主要有模板包括函数模板和类模板、异常处理、命名空间和运行时类型别,以帮助程序设计人员更方便地进行程序的计和试作。99年ANSIC++ 将它们纳入了ANSIC++标准,建议所有的C++编译系统都能实现这些功能。这些工具是非常有用的,C++的使用者应当尽量使用这些工具。 程序中常见的错误有两大类:语法错误和运行错误。 大。因此,C++采取的办法是:如果在执行一个函 C++处理异常的机制是由个部分组成的,即检查(ry、抛出(hrow)和捕捉(ath)。把需要检查的语句放在ty块中,thow用来当出现异常时发出一个异常信息,而cath则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。 例14.1给出三角形的三边a,b,c,求三角形的面积。#include<iostream>#include<cmath>intmain()while(a>0&&b>0&&}return }{doublearea;returnarea;}运行情况如下654↙(输入a,b,c的值11.512010(结束

(输出三角形的面积(输入a,b,c的值 修改程序,在函数traingle中对三角形条件进行检,如果不符合三角形条件,就抛出一个异常信息#include<iostream>#include<cmath>voidmain()doublea,b,c;try//在try块中包含要检查的{while(a>0&&b>0&&} //用catch捕捉异常信息并作相应处}doubletriangle(doublea,doubleb,doublec)//}程序运行结果如下654↙(输入a,b,c的值

11.512

(输入a,b,c的值a=1,b=2,c=1,thatisnotatriangle!(异常处理) 程序开始运行后,按正常的顺序执行到ty块,开始执行ty块中花括号内的语句。如果在执行ty块内的语句过程中没有发生异常,则cath子句不起作用,流程转到cath子句后面的语句继续执行。如果在执行ty块内的语句包括其所调用的函数过程中发生异常,则throw运算符抛出一个异常信息。thow抛出异常信息后,流程立即离开本函数,转到其上一级的函数(main函数。 throw表达式

。try块和catch块作为一个整体出现,catch块是try-。 名,如 catch(double 此时如果thow抛出的异常信息是duble型的变量a,则cath在捕获异常信息a的同时,还使d获得a的值,或者说d得到a的一个拷贝。什么时候需要这样做呢?有时希望在捕获异常信息时,还能利用throw抛出的值,如catch(double{cout<<″throw catch(…) 例14.2这是一个简单的例子,用来说明在ty块中有函数自己先分析以下程序。 #include<iostream>usingnamespacestd;intmain(){voidf1();{f1调用f1return0;}voidf1({voidf2({f2(

} voidf2({voidf3({f3(

}voidf3({throw } 图程序运行结果如下 如果将f3函数中的catch

(执行主函数中最后一个语句时的输出程序运行结果如下

(在主函数中捕获异常(执行主函数中最后一个语句时的输出 在函数型,C++允许在函数时列出可能抛出的异常类 如果在函数时未列出可能抛出的异常类型,则如果想一个不能抛出异常的函数,可以写成以doubletriangle(double,double,double)throw();//throw无参息,程序将终止。 如果在ty块或ty块中调用的函数中定义了类对象,在建立该对象时要调用构造函数。在执行ty块包括在try块中调用其他函数)的过程中如果发生了异常,此时流程立即离开ty块。这样流程就有可能离开该对象的作用域而转到其他函数,因而应当事先做好结束对象前的清理工作,C++的异常处理机制会在throw抛出异常信息被cth捕获时,对有关的局部对象进行析构调用类对象的析构函数),行与异常信息匹配的cath块中的语句。 例14.3#include<iostream>#include<string>classStudent{cout<<″constructor-~Student(){cout<<″destructor-″<<num<<endl;}//定义析构函voidget_data();intstring

elsecout<<num<<″cout<<″in中}

//如num=0,抛出int型变量//若num≠0,输出voidfun({Studentstud1.get_data();stud2.get_data();}

//调用stud1的get_data函//调用stud2的get_data函intmain(cout<<″callfun()″<<endl;

//表示调用fun函{fun //调用fun函 catch(int //表示num=0出cout<<″mainreturn}程序运行结果如下callfun()constructor-1101inget_data()mainend

usingnamespace 命名空间是ANSIC++引入的可以由用户命名的作 单元)、函数和复合语句。C++又引入了类作用 同名的函数。在时,为了区别,应该加上类名 class voidfun1();intvoidA::fun1({}classvoidfun1();voidfun2(voidB::fun1({

//定义A类中的fun1函 B//定义B类中的fun1函} 在文件中可以定义全局变量(globalvariable),它的intint externint表示文件B中的变量a是在其他文件中已定义的变量。 ,在程序编译和连接后,文件A的变量a的作用域扩展到了文件B。如果在文件B中不再对acout<<a;//得到a的值为 例14.4名 #include<string>#include<cmath>class Student(intn,stringnam,char voidget_data(); intnum; voidStudent::get_data( {cout<<num<<″″<<name<<″ } {return#includeusingnamespacestd;intmain()

中{Studentstud1(101,″Wang″,18);//定义类对象stud1.get_data();return0;} 101Wang#include<string>usingnamespaceclass StudentStudent(intn,stringnam,char voidget_data();

//参数与header1中的student不 intnum;

//此项与header1不voidStudent::get_data( {cout<<num<<″″<<name<<″ } //{returnsqrt(a- //mainusingnamespacestd;intmain()

return}这时程序编译就会出错。因为在预编译后,头文件 不仅如此,在程序中还往往需要一些库,为此同的实体名,则在编译时就会出现名字。例如:将实体的名字写得长一些;把名字起得特殊 名空间的工具。人们希望ANSIC++标准能够解决 为了解决上面这个问题,ANSIC++增加了命名空namespacens1//指定命名空间{int}全局变量,仅仅是把它们隐藏在指定名空间中 和作用域分辨符“::”,如ns1::a,ns1::b。这种用法称为命名空间限定(qualified),这些名字(如ns1::a)称为被限定名(qualifiedname)。C++中命名空间的 变量(可以带有初始化函数(可以是定义 例 {constintRATE=0.08;//doubledoubletax({returna*RATE;}namespacens2{int

名空}cout<<ns1::ns2::age<<endl;//需要指定外层的和内 例14.5利用命名空间来解决例14.4程序名字问修改两个头文件,把在头文件中的类分别放在两个不同名空间中。//header1.h头文件1)#include<string>#include<cmath>usingnamespacestd; {class voidget_data(intnum;intage;void {cout<<num<<″″<<name<<″}doublefun(doublea,doubleb)//在命名空间ns1内定义fun{return}//header2.h头文件2)#include<string>#include<cmath> usingnamespace{class

voidget_data();intchar voidStudent::get_data({cout<<num<<″″<<name<<″ }} //mainfile(主文件)#include<iostream>usingnamespacestd;intmain()

{ns1::Studentstud1(101,″Wang″,18);//用命名空间ns1 stud1.get_data();

();//调用命名空间ns1中的fun函ns2::Studentstud2(102,″Li″,′f′);//用命名空间ns2 的Student类定义stud2.get_data(return}

Li

这种方法是有效的,能保证所的实体有惟一的名空间嵌套的情况下,为一个实体,需要写很长的名字。在一个程序中可能要多次命名空间 可以为命名空间起一个别名(namespacealias) 命名空间,名 namespaceTV evision;//别名TV与原 evision等使用using using Studentstud1(101,″Wang″,18);//此处的Student相当于ns1::Studentusingns1::fun;// //此处的fun函数相当于 但是要注意:在同一作用域中用using using 其后出现的Student是命名空间ns1中的

其后出现的Student是命名空间ns2中Student //请问此处的Student是哪个命名空间中的 (3)usingnamespace C++提供了usingnamespace语句来实现这一目的。usingnamespace语句的一般格式为usingnamespace命名空间usingnamespace //这里的fun函数是命名空间ns1中的fun函 在用usingnamespace 较方便。但是如果同时用usingnamespace 成员时才用usingnamespace语句。 以上介绍的是有名字名空间,C++还允许使用没有名字名空间,如在文件A中了以下的namespace//命名空间没有{void

//定义命名空间} 识符之间以及不同库中的标识符之间的同名,应该将不同库的标识符在不同名空间中定义(或)。标准C++库的所有的标识符都是在一个名为std名空间中定义的,或者说标准头文件std::cout<<″OK.″<<endl; cout是在命名空间std中定义的 在大多数的C++程序中常用usingnamespace语句对 usingnamespace usingnamespace 欢用若干个“us

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论