




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第12章 模板与异常处理大学大学C+程序设计教程程序设计教程#include class Complexdouble real, imag;public:Complex(double r = 0, double i = 0): real(r), imag(i)double Real()return real;double Imag()return imag;Complex operator +(Complex&);Complex operator +(double);Complex operator =(Complex);Complex Complex:operator + (Comp
2、lex &c)/ 重载运算符重载运算符 real = real+c.real;imag = imag+c.imag;return *this;Complex Complex:operator + (double d)/ 重载运算符重载运算符real = real+d;return *this;Complex Complex:operator = (Complex c)/ 重载运算符重载运算符real = c.real;imag = c.imag;return *this;int main()Complex c1(3,4),c2(5,6),c3;cout C1 = c1.Real() +
3、j c1.Imag() endl;cout C2 = c2.Real() +j c2.Imag() endl;c3 = c1+c2; /测试测试+=和和=运算符运算符cout “C3 = ” c3.Real() “+j” c3.Imag() endl; /输出输出C1看结果看结果c3 = c3+6.5;cout C3 + 6.5 = c3.Real() +j c3.Imag() endl;return 0;*复数加法运算*例11-6 抽象基类Shape的定义与用法创建一个工程创建一个工程打开所有打开所有cpp文件文件分别加入到工程并编译分别加入到工程并编译运行运行n新建一个工程新建一个工程n打
4、开打开date.cppdate.cpp,编译它编译它 n打开打开example11-7.cpp,example11-7.cpp,编译它编译它n解释日期类的定义思想解释日期类的定义思想 *例11-7 较完整的日期类定义与使用*说明afx.h中字符串类函数重载函数重载虚函数虚函数运算符重载运算符重载授课内容n模板模板 通用的语言描述称为模板通用的语言描述称为模板n函数模板函数模板 通用抽象的函数描述通用抽象的函数描述n类模板类模板 通用抽象的类描述通用抽象的类描述n异常处理机制异常处理机制 指用于控制程序期间错误的结构化方法指用于控制程序期间错误的结构化方法函数模板n定义一个函数模板的形式为:定义
5、一个函数模板的形式为:ntemplate n () nn nn其中其中中的模板参数的形式为中的模板参数的形式为class ,这里关键字,这里关键字class与一般所讲的类无关,而与一般所讲的类无关,而是与是与一起说明,这是一个内部类型或用户一起说明,这是一个内部类型或用户自己定义的数据类型。自己定义的数据类型。n在使用模板函数时,模板中的类型参数可用一个在使用模板函数时,模板中的类型参数可用一个实际类型替换,从而达到了类型通用的目的。实际类型替换,从而达到了类型通用的目的。 例12-1求两个数据最大值的函数模板#include #include using namespace std;temp
6、late T Max(T a, T b)return ab?a:b;int main()int i1 = 3, i2 = 5;double d1 = 3.3, d2 = 5.2;string str1(xjtu), str2(xian);cout Type int: Max(i1, i2) endl;cout Type double: Max(d1, d2) endl;cout Type string: Max(str1, str2) endl;return 0;#include int main()const int COUNT=16;int listCOUNT=503, 87, 512,
7、61, 908, 170, 897, 275,653, 426, 154, 509, 612, 677, 765, 703;for(int i=0; ii; j=j-1)if(listj-1listj) int tmp = listj-1;listj-1 = listj;listj = tmp;cout The result is : endl;for(int k=0;k16;k+)cout listk ;coutendl;return 0;*冒泡排序改成模板#include void bubble_sort( int a,int N) for(int i=0; ii; j=j-1) if(a
8、j-1aj) int tmp = aj-1;aj-1 = aj;aj = tmp;int main()const int COUNT=16;int listCOUNT=503, 87, 512, 61, 908, 170, 897, 275,653, 426, 154, 509, 612, 677, 765, 703;bubble_sort(list,16);cout The result is : endl;for(int k=0;k16;k+) cout listk ;coutendl;return 0;*冒泡排序改成模板函数模板的几点注意事项(1)在函数模板的参数表中,至少有一个参数的类
9、型为模板的)在函数模板的参数表中,至少有一个参数的类型为模板的类型参数。另外,函数的返回值的类型也可以是该类型参数。类型参数。另外,函数的返回值的类型也可以是该类型参数。(2)模板中可以带有多个参数类型。例如:)模板中可以带有多个参数类型。例如:template void func1(T1 arg1,T2 arg2, T3 arg3) (3)函数可以带有模板参数表中未给出的、已存在的数据类型)函数可以带有模板参数表中未给出的、已存在的数据类型的参数。例如:的参数。例如: template T func2(T arg1,int arg2) 例12-4 定义一个求幂函数的函数模板#include
10、template T Power(T a, int exp)T ans = a;while(-exp0) ans*=a;return ans;/ 测试用主函数int main()cout 35= Power(3, 5) endl;cout 1.12= Power(1.1, 2) endl;return 0;例12-5 用函数模板实现顺序查找算法#include template int sequentialsearch(T a, const T& k, int n)int i=0;while(k!=ai&in-1)i=-1;return i;int main() / 测试用主函
11、数int i1 =3, 2, 5, 0, -1, 7;double d1 =3.3, 2.1, 0.3, 1.5, 10.6, 5.2;char *c1=xjtu;cout sequentialsearch(i1, 15, 6) endl;cout sequentialsearch(d1, 3.3, 5) endl;cout sequentialsearch(c1, j, 4) endl;return 0;类模板n类是对问题空间的抽象,而类模板则是类是对问题空间的抽象,而类模板则是对类的抽象,即更高层次上的抽象。与对类的抽象,即更高层次上的抽象。与函数模板相似,程序中可以通过高度抽函数模板相似
12、,程序中可以通过高度抽象首先定义一个类模板,然后通过使用象首先定义一个类模板,然后通过使用不同的实参生成不同的类。不同的实参生成不同的类。n类模板的定义方法为:类模板的定义方法为:template class class ;例12-2 定义一个通用的栈类n#include ntemplate nclass AnyStacknTm_tStackn;nintm_nMaxElement;nintm_nTop;npublic:AnyStack() : m_nMaxElement(n), m_nTop(0)nint GetTop() return m_nTop;nbool Push(T);/入栈函数入栈
13、函数nbool Pop(T&);/出栈函数出栈函数n;ntemplate nbool AnyStack :Push(T elem)nif(m_nTop=m_nMaxElement)nm_tStackm_nTop = elem;nm_nTop+;nreturn true;nelsereturn false;nntemplate nbool AnyStack :Pop(T &elem)nif(m_nTop 0)nm_nTop-;nelem = m_tStackm_nTop;nreturn true;nelsereturn false;n定义一个通用的栈类(续)n/ 测试用主函数ni
14、nt main()nnint n;nchar * s1;nAnyStack iStack;/定义一个整数栈niStack.Push(5); niStack.Push(6);niStack.Pop(n);ncout 第一个出栈整数= n endl;niStack.Pop(n);ncout 第二个出栈整数= n endl;nAnyStack strStack;/定义一个字符串栈nstrStack.Push(Its first string);nstrStack.Push(Its second string);nstrStack.Pop(s1);ncout 第一个出栈字符串= s1 endl;nst
15、rStack.Pop(s1);ncout 第一个出栈字符串= s1 endl;nreturn 0;n定义通用数组类#include template class arraypublic:X *ptr;array(int N) ptr=new XN;int main()array a(16);a.ptr0=168;coutarray class: a.ptr0endl;return 0;异常处理机制n异常处理机制是异常处理机制是C+中用于管理程序运行期间错误的一种结构化方法。中用于管理程序运行期间错误的一种结构化方法。n其基本思想是将异常的检测与处理分离。当在一个函数体中检到异常条件存在,但无法
16、确定相其基本思想是将异常的检测与处理分离。当在一个函数体中检到异常条件存在,但无法确定相应的处理方法时,将引发一个异常,并由函数的直接或间接调用者检测并处理这个异常。用三应的处理方法时,将引发一个异常,并由函数的直接或间接调用者检测并处理这个异常。用三个保留字实现:个保留字实现:throw、try和和catch。其形式为:。其形式为:trycatch ( ) catch ( ) catch()n引发异常的引发异常的throw语句必须在语句必须在try语句块内,或是由语句块内,或是由try语句块中直接或间接调用的函数体执行。语句块中直接或间接调用的函数体执行。throw语句的一般形式为:语句的一
17、般形式为:throw exception;n注意,注意,catch语句的类型匹配过程中不作任何类型转换。语句的类型匹配过程中不作任何类型转换。常规处理带检测常规处理带检测第一种异常处理第一种异常处理第第n种异常处理种异常处理例12-3 异常处理机制的使用n#include nvoid testfun(int test)ntrynif(test)nthrow test;nelsenthrow it is a zero;nncatch(int i)ncoutExcept occurred: iendl;ncatch(const char *s)ncoutExcept occurred: sendl
18、;nnint main()nntestfun(10);ntestfun(100);ntestfun(0);nreturn 0;n异常规格说明n异常规格说明存在于函数说明中,位于参数列表之后。异常规格说明存在于函数说明中,位于参数列表之后。函数的所有潜在异常类型均随着关键字函数的所有潜在异常类型均随着关键字throw而插入而插入函数说明中。如:函数说明中。如: void SetElem(int i, int j, double val) throw(InvalidIndex);而传统的函数声明,如:而传统的函数声明,如:void SetElem(int i, int j, double val)
19、;可能抛出任何一种异常。可能抛出任何一种异常。n好的编程习惯:对于每一个有异常抛出的函数都应当好的编程习惯:对于每一个有异常抛出的函数都应当加入异常规格说明。加入异常规格说明。例12-6 除0异常#include /Example 12-6: 除除0异常异常double Div(double a, double b);int main() / 测试用主函数测试用主函数 double n1, n2, result; coutInput two number: n1n2) tryresult=Div(n1,n2);coutn1/n2=resultendl;catch(double)coutExce
20、pt occurred: attempted to divide by zero.endl; coutInput two number: endl; coutThat is ok.endl; return 0;double Div(double a, double b)if(b=0.0)throw b;return a/b;求一元二次方程的根(要求使用异常机制)#include /Example 12-7: 解一元二次方程解一元二次方程#include void Root(double a,double b,double c)double x1, x2, delta; delta=b*b-4*
21、a*c; if(a=0) throw divide by zero;if(delta0) throw 0; x1=(-b+sqrt(delta)/(2*a); x2=(-b-sqrt(delta)/(2*a); coutx1=x1endlx2=x2endl; int main( ) double a, b, c; cout a b c; try Root(a,b,c); catch(char *) coutExcept occurred: it is not a quadratic equation. endl; catch(int) coutExcept occurred: the real
22、 root of this equation does not exist. endl; return 0; 习 题n1 1编写一个求绝对值的函数模板,并测试。编写一个求绝对值的函数模板,并测试。n2 2请将例请将例4-54-5的冒泡排序函数改写成为模板函数并编写一个程序进行测试。的冒泡排序函数改写成为模板函数并编写一个程序进行测试。n3 3在在12.1.212.1.2类模板一节中,我们定义了一个任意类类型类模板一节中,我们定义了一个任意类类型AnyTypeAnyType,请编写一,请编写一个程序来使用该个程序来使用该AnyTypeAnyType类模板。类模板。n4 4例例12-212-2中所定义的通用栈类实际上是不完善的,如无法根据用户需求改变中所定义的通用栈类实际上是不完善的,如无法根据用户需求改变栈的大小,没有提供栈满溢出
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 8059-2025家用和类似用途制冷器具
- GB 28288-2025足部防护足趾保护包头
- 2025年医美项目申请报告
- 2025江苏省人民医院宿迁医院(宿迁市第一人民医院)高层次人才引进48人模拟试卷及答案详解(名师系列)
- 服务满意水平提升责任承诺书(6篇)
- 2025河南郑州城市职业学院招聘考前自测高频考点模拟试题及一套完整答案详解
- 金融机构稳健管理承诺书9篇
- 2025湖北天门市城市社区专职工作人员招聘59人模拟试卷及答案详解参考
- 如果我是一朵云的故事6篇范文
- 2025江苏盐城市射阳县农业水利投资开发集团有限公司招聘人员拟聘用考前自测高频考点模拟试题及答案详解(各地真题)
- 2025-2030光伏新能源行业发展现状及未来趋势预测报告
- 浙江精诚联盟2025-2026学年高二上学期10月联考英语(含答案)
- 2025-2026学年北师大版数学小学三年级上册(全册)教案设计及教学计划
- 少先队代表大会专题教育
- 管理学研究与论文写作研究方法课件
- 血管外科出科考试题2
- tlc4000中文说明书在使用本产品前务必先仔细阅读并按照相关要
- GB 38454-2019 坠落防护 水平生命线装置
- 001中二氯乙醇残留检测报告
- ppt精选模板:热烈欢迎领导莅临指导工作PPT课件
- 主要负责人及管理人员安全培训
评论
0/150
提交评论