第八章异常处理与模板 主要内容: ●异常处理概述:什么是异常以及异常处理的基本思想 异常处理基础:引发异常、捕获异常和异常处理的基本格式、异常类型及其匹配、再抛 ● 出异常、异常接口声明以及异常处理的执行过程。 ●异常处理中的构造与析构:抛出异常时的拷贝构造函数,在完全构造的对象与部分构造 的对象中抛出异常以及在析构函数中抛出异常。 模板的概念:模板的基本概念,模板的分类以及类模板、函数模板、模板类、模板函数 和对象之间的关系。 ●函数模板与模板函数:函数模板的定义格式、函数模板的实例化(模板函数),以及函 数模板和模板函数与一般函数的重载。 ● 类模板与模板类:类模板的定义格式以及类模板的实例化。 模板的特性:模板与继承的关系、模板与友元的关系以及模板与静态成员的关系。 选择 1模板是实现类属机制的一种工具,其功能非常强大,它既允许用户构造类属函数,即① ;也允许用户构造类属类,即②。 A模板函数 B函数模板 C模板类 D类模板 答案:①A ②C 注释:模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。 2类模板的模板参数 A只可作为数据成员的类型 B只可作为成员函数的返回类型 C只可作为成员函数的参数类型 D以上三者都有 答案:D 注释:类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参 数和返回值可以取任意数据类型。 填空 1从一个模板函数产生的模板函数是同名的,因此编译器用重载的解决方法调用相应函数。 注释:同一函数模板实例化后的所有模板函数都必须执行相同的动作。 2函数模板的友元函数可以是模板函数或者非模板函数。 注释:函数模板的友元函数可以是如下形式: friend void fl(); friend void f2(X&) >friend void A::f3(); friend void C::f4(X&); 3如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生多个静态变量。 注释:类模板的每个实例,即每个模板类都会产生一个相应的静态数据成员变量,该模板类 的所有对象共享一个该类的静态数据成员
第八章 异常处理与模板 主要内容: z 异常处理概述:什么是异常以及异常处理的基本思想 z 异常处理基础:引发异常、捕获异常和异常处理的基本格式、异常类型及其匹配、再抛 出异常、异常接口声明以及异常处理的执行过程。 z 异常处理中的构造与析构:抛出异常时的拷贝构造函数,在完全构造的对象与部分构造 的对象中抛出异常以及在析构函数中抛出异常。 z 模板的概念:模板的基本概念,模板的分类以及类模板、函数模板、模板类、模板函数 和对象之间的关系。 z 函数模板与模板函数:函数模板的定义格式、函数模板的实例化(模板函数),以及函 数模板和模板函数与一般函数的重载。 z 类模板与模板类:类模板的定义格式以及类模板的实例化。 z 模板的特性:模板与继承的关系、模板与友元的关系以及 模板与静态成员的关系。 选择 1 模板是实现类属机制的一种工具,其功能非常强大,它既允许用户构造类属函数,即 ① ;也允许用户构造类属类,即 ② 。 A 模板函数 B 函数模板 C 模板类 D 类模板 答案:① A ②C 注释:模板分为函数模板和类模板,它们分别允许用户构造模板函数和模板类。 2 类模板的模板参数 。 A 只可作为数据成员的类型 B 只可作为成员函数的返回类型 C 只可作为成员函数的参数类型 D 以上三者都有 答案:D 注释:类模板使用户可以为类定义一种模式,使得类中的某些数据成员、某些成员函数的参 数和返回值可以取任意数据类型。 填空 1 从一个模板函数产生的模板函数是同名的,因此编译器用重载的解决方法调用相应函数。 注释:同一函数模板实例化后的所有模板函数都必须执行相同的动作。 2 函数模板的友元函数可以是模板函数或者非模板函数。 注释:函数模板的友元函数可以是如下形式: ¾ friend void f1(); ¾ friend void f2(X&); ¾ friend void A::f3(); ¾ friend void C::f4(X&); 3 如果在类模板的定义中有一个静态数据成员,则在程序运行中会产生多个静态变量。 注释:类模板的每个实例,即每个模板类都会产生一个相应的静态数据成员变量,该模板类 的所有对象共享一个该类的静态数据成员。 1
阅读程序 写出运行结果 1 #include int Div(ints,inty) { if(y=0) throw y; return x/y; void main() { try cout template Tmax(Tx,Ty) { return (x>y?x:y); 2
阅读程序 写出运行结果 1 #include int Div(int s,int y) { if(y==0) throw y; return x/y; } void main() { try { cout template T max ( T x, T y) { return (x>y?x:y); } 2
void main() cout template class Sample { Tn; public: Sample(T i)(n=i;) void operator++(); void disp0{cout void Sample::operator ++( { n+=l: ∥不能用n++,因为double类型不能用++ void main() Samples('a'); s+; s.disp(), } 答案:n=b 注释:说明类模板的使用方法。Sample是一个类模板,由它产生模板类Sample,通 过构造函数给n赋值,通过重载++运算符使n增1,这里n由'a'增1变成b'。 程序设计 1编写一个程序,采用异常处理的方法,在指定的文件不存在时显示出错信息:文件存在时 显示其大小。 参考答案: 当文件流fle不存在时,则fle.fail()返回真,抛出一个字符串错误,在catch()中检测 该错误,输出出错信息。本题程序如下: include include void main ( 3
void main() { cout template class Sample { T n; public: Sample(T i) {n=i;} void operator++(); void disp() {cout void Sample::operator ++() { n+=1; //不能用 n++,因为 double 类型不能用++ } void main() { Sample s(‘a’); s++; s.disp(); } 答案:n=b 注释:说明类模板的使用方法。Sample 是一个类模板,由它产生模板类 Sample,通 过构造函数给 n 赋值,通过重载++运算符使 n 增 1,这里 n 由’a’增 1 变成’b’。 程序设计 1 编写一个程序,采用异常处理的方法,在指定的文件不存在时显示出错信息;文件存在时 显示其大小。 参考答案: 当文件流 file 不存在时,则 file.fail()返回真,抛出一个字符串错误,在 catch()中检测 该错误,输出出错信息。本题程序如下: # include # include void main () 3
char fn[20]; cout>fn: ifstream file(fn,ios:;nocreate(ios::in); try if(file.fail()) throw“error', } catch(char *s) { coutTmin(Ta,Tb),可以处理int,float和char等数据 类型,为了能正确处理字符串,添加一个重载函数专门处理字符串比较,即char*min(char *a,char*b)。本题程序如下: #include #include template T min(Ta,Tb) { return (a<b?a:b); } char *min(cha *a,char *b) return (strcmp(a,b)<0?a:b); } void main() { double a=3.56.b=8.23: char s1[0=”Hello'”,s20=”Good”, cout<输出结果:”<<endl; cout<<”“<<a<”,”<<b<<”中较小者:”<min(a,b)K<endl; cout<<”“<sl<<”,”<<s2<<”中较小者:”<<min(sl,s2)<endl; 4
{ char fn[20]; cout>fn; ifstream file (fn,ios:;nocreate(ios::in); try { if(file.fail()) throw “error”; } catch(char *s) { cout T min(T a ,T b),可以处理 int,float 和 char 等数据 类型,为了能正确处理字符串,添加一个重载函数专门处理字符串比较,即 char *min( char *a, char *b)。本题程序如下: #include #include template T min (T a, T b) { return (a<b?a:b); } char *min(cha *a, char *b) { return (strcmp(a,b)<0?a:b); } void main() { double a=3.56,b=8.23; char s1[]=”Hello”,s2[]=”Good”; cout<<”输出结果:”<<endl; cout<<” “<<a<<”,”<<b<<”中较小者:”<<min(a,b)<<endl; cout<<” “<< s1<<”,”<<s2<<”中较小者:”<<min(s1,s2)<<endl; 4
程序执行结果: 输出结果: 3.56,8.23中较小者:3.56 Hello,Good中较小者:Good 3一个Sample类模板的私有数据成员为Tn,在该类模板中设计一个operator--=重载运算符 函数,用于比较各对象数据的n数据是否相等。 本题程序如下: #include template class Sample { T public: Sample(T i)(n=i; int operator=(Sample &) 方 template int Sample::operator-(Sample &s) { if(n==s.n) return 1; else return 0; } void main() Samples1(2).s2(3): couts3(2.5),s4(2.5); cout<<”s3与s4的数据成员”<(s3=s4?”相等”.”不相等)<<endl; 程序执行结果: s1与s2的数据成员不相等 s3与s4的数据成员相等 5
} 程序执行结果: 输出结果: 3.56,8.23 中较小者:3.56 Hello,Good 中较小者:Good 3 一个 Sample 类模板的私有数据成员为 T n,在该类模板中设计一个 operator==重载运算符 函数,用于比较各对象数据的 n 数据是否相等。 本题程序如下: #include template class Sample { T n; public: Sample(T i) {n=i; } int operator==(Sample &); }; template int Sample::operator==(Sample &s) { if(n==s.n) return 1; else return 0; } void main() { Sample s1(2),s2(3); cout s3(2.5),s4(2.5); cout<<”s3 与 s4 的数据成员”<<(s3==s4? ”相等”:”不相等”)<<endl; } 程序执行结果: s1 与 s2 的数据成员不相等 s3 与 s4 的数据成员相等 5