第6章 模板与异常处理
被调用函数直接检测到异常条件并使用throw引发 一个异常
在上层调用函数中使用try检测函数调用是否引发 了异常 被检测到的各种异常由catch语句捕获并作相应处 理
异常处理:在函数中直接处理方法:
#include<iostream> using namespace std;
模板与异常处理
例2. 函数模板的应用 #include <iostream.h> template <class T> //声明模板 T max(T a, T b) { return (a>b? a:b); }
Hale Waihona Puke void main( ) { int a=9, b=99; cout << "max(a,b): " << max(a,b) << endl; float c=5.0, d=9.0; cout << "max(c,d): " << max(c,d) <<endl; }
模板与异常处理
void mian( ) { int a[ ]={4, 3, 4, 5, 8, 9}; double d[9]={2.0, 4.3, 1.8, 9.5}; sort(a, 6); //对整型数进行排序 sort(d, 9); //对双精度实型进行排序 cout << " \n output sort for int a: " for(int i=0; i<6; i++) cout << a[i] << " , "; cout << " \n output sort for double d: " ; for(int j=0; j<9; j++) cout << d[j] << ", "; } 结果: output sort for int a: 3, 4, 4, 5, 8, 9, output sort for double d: 0.0, 0.0, 0.0, 0.0, 0.0, 1.8, 2.0, 4.3, 9.5,
类模板与模板类 • 类模板的概念:
模板与异常处理
– 所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的 返回类型和形参类型不具体指定,用一个虚拟的类型来代表。使用 类模板定义对象时,系统会根据实参的类型来取代类模板中虚拟类 型从而实现了不同类的功能。
• 类模板的定义:
– Template <typename\class 类型参数> – Class 类名 { 类成员的声明 };
模板与异常处理
• 函数模板与模板函数的关系:
函数模板 Max(at,at)
模板函数 Max(int,int)
模板函数 Max(double,double)
模板函数 Max(char,char)
模板与异常处理
改错并说明理由:
Template (class T) T max(T a; T b; Tc ); //求 a,b,c 的最大值 { int t; if(a>b) { if(a>c) t=a else t=c; } else; { if(b>c) t=c; else t=b; } };
char c;
while(fileSource.Read(&c, 1)) fileDestin.Write(&c, 1);
fileSource.Close();
fileDestin.Close(); }
文件拷贝程序
catch(CFileException *e) { switch(e->m_cause) {case CFileException::fileNotFound:
Int main() { Compare<int>com1(3,7); Compare<double>com2(12.34,56.78); Compare<char>com3(‘a’,’x’); Cout<<“其中最大值是:”<<com1.max()<<end Cout<<“其中最大值是:”<<com2.max()<<end Cout<<“其中最大值是:”<<com3.max()<<end Return 0; } 运行结果: 其中最大值:7
cin >> SourceName;
cout << "\n请输入目标文件名:"; cin >> DestinName;
文件拷贝程序
try {
CFile fileSource(SourceName, CFile::modeRead);
CFile fileDestin(DestinName, CFile::modeCreate|Cfile:: modeWrite);
break;
文件拷贝程序
case CFileException::diskFull: cout << "磁盘满!" << endl;
break;
default: cout << "在文件拷贝过程中发生不知名错误!"
<< endl;
break; } } }
{
if (y==0) throw y; return x/y; }
程序设计举例: 文件拷贝程序
#include <iostream.h> #include <afx.h> void main() {
char SourceName[81];
char DestinName[81]; cout << "\n请输入源文件名:";
模板与异常处理
例1 有关内容总结 1. 定义了一个模板函数 sort, 将类型声明为函数的形式参数; 2. 在函数的具体调用中, 形式参数的类型为 : int 和 double; 3. 仅定义了一个模板, 可应用于多种类型, 使编程简便, 代码 重用;
4. 类型放在< > 中, 而不是 [ ] 或 ( ) 中。
cout << "未找到文件!" << endl;
break; case CFileException::badPath:
cout << "路径输入有错!" << endl;
break; case CFileException::accessDenied:
cout << "没有访问权限!" << endl;
其中最大值:56.78 其中最大值:x
模板与异常处理
• 类模板、模板类和对象之间关系:
类模板 Compare<T>
类模板 Compare<int>
类模板 Compare<double>
类模板 Compare<char>
对象com1
对象com2
对象com3
调试技术:异常处理机制
在编写程序时,不仅要保证程序的正确性,而且 还要求程序安全可靠,具有一定的容错能力。
int Div(int x,int y);
int main() {cout<<"7/3="<<Div(7,3)<<endl; cout<<"5/0="<<Div(5,0)<<endl; return 0; } int Div(int x,int y) { if (y==0) { cout<<"除数为零,错误!"<<endl; exit(0); } return x/y;
模板与异常处理
• 类外声明:
Template<typename t> Class compare{ Public: compare(t a,,t b) t max() Private: t x,y; };
Template<typename t> Compare<t>::compare(t a,,t b) {x=a;y=b; } Template<typename t> T Compare<t>:: max() { return (x>y)?x:y; }
模板与异常处理
• 例3、求两个数最大值的类模板:
Template<typename t> Class compare{ Public: compare(t a,,t b) {x=a;y=b; } t max() { return (x>y)?x:y; } Private: t x,y; };
Int main() { Compare<int>com1(3,7); Compare<double>com2(12.34,56.78); Compare<char>com3(‘a’,’x’); Cout<<“其中最大值是:”<<com1.max()<<endl; Cout<<“其中最大值是:”<<com2.max()<<endl; Cout<<“其中最大值是:”<<com3.max()<<endl; }