《Chapter_6_模板与异常处理课件》由会员分享,可在线阅读,更多相关《Chapter_6_模板与异常处理课件(75页珍藏版)》请在金锄头文库上搜索。
1、Chapter 6 模板与异常处理,泛型程序设计,本章主要内容,模板的概念 函数模板与模板函数 类模板与模板类 异常处理,为什么使用模板?,int max(int a,int b) return(ab)?a,b; long max(long a,long b) return(ab)?a,b; double max(double a,double b) return(ab)?a,b; char max(char a,char b) return(ab)?a,b; 若使用模板,则只定义一个函数: template type max(type a,type b) return(ab)?a,b;,模板
2、,模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码重用。 模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。,本章主要内容,模板的概念 函数模板与模板函数 类模板与模板类 异常处理,template template template,函数模板的说明,函数模板的一般说明形式如下: 其中,template是一个声明模板的关键字,它表示声明一个模板。 template为模板函数的声明。 class T1,class T2,为模板形参T1、T2为虚拟类型参数。 可把模板形参改为:typename T1,typename T2,templa
3、te type max(type a,type b) return(ab)?a,b;,template 返回类型 函数名(形参表) 函数体 ,函数模板的使用,上面定义的函数代表的是一类函数,若要使用这个函数求两个数的最大值操作,必须先将type实例化。 实例化的参数称为模板实参,用模板实参实例化的函数称为模板函数。 模板参数的调用,模板函数名(实参表);,例:定义用于变量交换的函数模板,int main() char a=A, b=B; int c=123, d=456; double e=12.3, f=45.6; swp(a,b); swp(c,d); swp(e,f); cout 交换后
4、: a , b endl; cout 交换后: c , d endl; cout 交换后: e , f endl; system(pause); return 0; ,template void swp(T ,函数模板就像是一个带有类型参数的函数,编译程序会根据实际参数的类型确定参数的类型。,例有两个类型参数的函数模板,#include using namespace std; template void myfunc(type1 x,type2 y) coutx yendl; int main() myfunc(10,hao); myfunc(0.123,10L); return 0; ,例
5、 函数模板printArray,#include using namespace std; template void printArray( const T *array, int count ) for ( int i = 0; i count; i+ ) cout array i ; cout endl; ,int main() const int aCount = 5; const int bCount = 7 const int cCount = 6; int a aCount = 1, 2, 3, 4, 5 ; double b bCount = 1.1, 2.2, 3.3, 4.
6、4, 5.5, 6.6, 7.7 ; char c cCount = “HELLO”; cout Array a contains: endl; printArray( a, aCount ); cout Array b contains: endl; printArray( b, bCount ); cout Array c contains: endl; printArray( c, cCount ); return 0; ,例 example6-1,模板函数的覆盖,下列函数模板: template T max(T a, T b) retum ab?a:b; 对于简单的数据类型,如整型、实
7、型、字符型数据,这个模板能够正常工作。 对于字符串,用上述模板就会出现问题,因为对于字符串,不能使用运算符“”,要为其编写独立的max()函数。,例 模板函数的覆盖,#include #include using namespace std; template T max1(T a, T b) return ab?a:b; char *max1(char *x, char *y) return strcmp(x, y) 0 ? x :y; ,int main() char *p=ABCD, *q=EFGH; p=max1(p, q); int a =max1(10, 20); float b
8、=max1(12.3, 45.6); cout p endl; cout a endl; cout b endl; system(pause); return 0; ,如果某一函数的函数原型与函数模板生成的函数(模板函数)原型一致,称该函数为模板函数的覆盖函数。,模板函数的重载,template type max(type a, type b, type c) int t=(ab)?a,b; return(tc)?t,c; ,template type max(type a, type b) return(ab)?a,b;,函数模板的使用,在进行函数调用时,编译程序采用如下策略确定调用哪个函数
9、: ()首先寻找一个实参与形参完全匹配的覆盖函数,如果找到,则调用该函数。 ()如果能通过函数模板生成实例函数,并且参数匹配,则调用该函数。 ()通过强制类型转换,寻找能够与实参匹配的覆盖函数,如果找到则调用该函数。 ()如果所有努力失败,则给出出错信息。,例 example6-2,本章主要内容,模板的概念 函数模板与模板函数 类模板与模板类 异常处理,为什么需要类模板?,class INTEGER int item; public: INTEGER(int); void set_item(int); int get_item( ); ; void main( ) INTEGER Obj(20
10、); Obj.set_item(120); Obj.get_item( ); ,class REAL float item; public: REAL(float); void set_item(float); float get_item( ); ; void main( ) REAL Obj(2.0); Obj.set_item(12.0); Obj.get_item( );,类模板与模板类,如果有多个类,其数据成员、成员函数相同,而只是某些数据成员的类型不同,可用类模板的方法处理。 类模板允许用户为类定义一种模式,使得类中的某些数据成员,某些成员函数的参数或返回值,能取任意数据类型。,例
11、,template class TemClass T item; public: TemClass(T); void set_item(T); T get_item( ); ;,void main( ) TemClass Objint(20); TemClass Objfloat(2.5); TemClass Objchar(A); Objint.set_item(120); Objchar.get_item( ); ,类模板的定义,template class 类模板名 类体 ,2、成员函数的定义 在类体中定义(即定义为内置函数):同普通类成员函数的定义。 在类体外定义(定义在头文件中),1
12、、类模板的定义 格式:,template 返回类型 类模板名:函数名(形参表) 函数体 ,类模板的使用,与函数模板一样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。 格式为: 类名 对象名;,例 对不同数据类型的数组进行输入、输出、求最大值、排序处理。,#include using namespace std; const int size=50; template class array T xsize; public: array() int i; for(i=0;isize;i+) xi=0; ,void input(int n) int i; for
13、(i=0;ixi; void print(int n) int i; for(i=0;in;i+) cout xi ; coutendl; T max(int n); void sort(int n); ;,template T array: max(int n) T m; m=x0; int i; for(i=1;in;i+) if (mxi) m=xi; return m; ,template void array: sort(int n) int i,j; T t; for(i=0;in-1;i+) for(j=i+1;jn;j+) if(xixj) t=xi;xi=xj;xj=t; ,
14、int main() int n; array ob1; coutn; cout ob2; ob2.input(n);ob2.print(n); coutmax=ob2.max(n)endl; ob2.sort(n); coutsort:;ob2.print(n); ,例 类模板 Stack,例 example6-3 例 example6-4,本章主要内容,模板的概念 函数模板与模板函数 类模板与模板类 异常处理,异常处理,异常处理的概念和任务 异常处理的方法 在函数声明中进行异常情况指定 标准库异常类层次 堆栈展开 异常处理中的析构函数,异常处理的概念,程序的错误 编译错误 逻辑错误 异常:
15、编译通过,运行得不到正确结果,甚至导致程序不正常终止,或出现死机现象。 异常可以预料,但不能避免 除数为0 内存空间不够 无法打开文件 输入数据类型有误 C+中的异常机制是对所能预料的运行错误进行处理的一套实现机制。,异常处理的概念,程序逻辑,考虑以下伪代码: 执行一个任务 如果这个任务没有正确执行 则执行错误处理 执行一个任务 如果这个任务没有正确执行 则执行错误处理 将程序逻辑和错误处理混在一起使程序难以阅读。 异常处理使程序员能够将处理错误的代码从程序执行的“主流程”中分离出来,这样能提高程序的清晰度及使程序更易于修改。,异常处理的基本思想,异常为从分配资源的代码转向处理错误状态的代码提供一种表达方式。 异常的发现与处理可以不在同一函数中完成。 如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信息,传给它的上一级(即调用它的函数),它的上级捕捉到这个信息后进行处理。,异常处理的基本思想,异常处理的实现,C+处理异常的机制是由3个部分组成的,即检查(try)、抛出(throw)和捕捉(catch)。 try块中包含可能引起异常的语句和在异常发生时应该跳过的语句。 throw用来当出现异常时发出一个异常信息 catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。,例,void main( ) double a,b,c; cinabc