第六章_模板与异常处理.ppt
文本预览下载声明
1.为什么使用模板? 上述利用函数的重载技术实现了不同类型变量的交换。但可以发现,这两个函数,除参数的类型不同之外,函数体代码完全相同,完成的功能也完全相同。所产生的问题是,程序代码的重复。 函数模板,正是为解决该问题而引入的,将类型作为函数参数,从而实现通用编程,达到代码共享的目的。 异常处理 例 输入三角形三条边,求三角形面积 #include iostream #include cmath using namespace std; int main() {double triangle(double,double,double); double a,b,c; cout输入三角形三条边:; cinabc; while(a0b0c0) //可以多次输入,求多个三角形面积 {couttriangle(a,b,c)endl; cout输入三角形三条边:; cinabc; } return 0; } 异常处理 double triangle(double a,double b,double c) {double area; double s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); return area; } triangle函数并没有检查三条边是否能构成三角形,只是求面积;而主程序中也没有检查。 异常处理 4.2异常处理 异常处理有助于提高程序的容错性和健壮性。有了异常处理,程序就能在解决问题后继续执行(而不是终止)。 什么时候使用异常处理? 异常处理是设计用来处理同步(synchronous)错误的,这些错误发生在一个语句正在执行的时候。 常见的有:数组下标越界、运算溢出(一个值超过它的值域)、除数为0、无效的函数参数和失败的内存分配(由于内存不足)。 * * * * * * * * * * * * * * * * * * 异常处理中的析构函数 如果在try块(或try块中调用的函数)中定义了类对象,在建立该对象时要调用构造函数。在执行try块的过程中如果发生了异常,此时流程立即离开try块。这样流程就有可能离开该对象的作用域而转到其他函数,因而应当事先做好结束对象前的清理工作。 C++的异常处理机制会在throw抛出异常信息被catch捕获时,对有关的局部对象进行析构(调用类对象的析构函数), 析构对象的顺序与构造的顺序相反,然后执行与异常信息匹配的catch块中的语句。 例 class Student {public: Student(int n,char* nam) { cout″constructor-″nendl; num=n;name=nam;} ~Student( ) { cout″destructor-″numendl;} void get_data( ) { if(num==0) throw num; else coutnum″ ″nameendl; cout″in get_data()″endl; } private: int num; char * name; }; void fun( ) { Student stud1(1101,″Tan″); stud1.get_data( ); Student stud2(0,″Li″); stud2.get_data( ); } void main( ) { cout″main begin″endl; cout″call fun( )″endl; try { fun( ); } catch(int n) {cout″num=″n″,error!″endl;} cout″main end″endl; } 运行结果: main begin call fun( ) constructor-1101 1101 tan in get_data() constructor-0 destructor-0 destructor-1101 num=0,error! main end 若改为 void fun( ) { Student stud1(1101,″Tan″); stud1.get_data( ); try { Student stud2(0,″Li″); stud2.get
显示全部