C++面向对象程序设计学习笔记(7)
模板与异常处理
模板的概念
模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型作为参数。
模板分为函数模板和类模板,它们分别允许用户构造模板类和模板函数
函数模板与模板函数
函数模板实际上建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。
在调用函数时系统会根据实参的类型(模板实参)来取代模板中的虚拟类型从而实现了不同函数的功能。
声明格式如下
template<typename 类型参数>
返回类型 函数名 (模板形参表)
{
函数体
}
或
template<class 类型参数>
返回类型 函数名 (模板形参表)
{
函数体
}
其中,template是一个声明模板的关键字,它表示声明一个模板。
类型参数实际上是一个虚拟的类型名,现在并未指定它的具体类型,但是用函数模板时,必须进行实例化。
类型参数前需要加一个关键字typename或class,其作用相同,都是表示其后的参数是一个虚拟的类型名。
例 max函数模板化
template<typename T>
T mymax(T a,T b)
{
if(a>b) return a;
return b;
}
或
template<class T>
T mymax(T a,T b)
{
if(a>b) return a;
return b;
}
在使用函数模板时,关键字typename 或 class 后的类型参数必须实例化,即用实际的数据类型替代它
将函数模板中的类型参数实例化的参数称为模板实参
注意:
1.在函数模板中允许使用多个类型参数,但template定义部分的每个类型参数前必须有关键字typename(或class)
2.在template语句与函数模板定义语句之间不允许有别的语句
3.函数模板可以重载
4.函数模板与同名的非模板函数可以重载,调用顺序是先寻找一个参数完全匹配的非模板函数,再实例化函数模板
类模板与模板类
所谓类模板实际上是建立一个通用类,其数据成员、成员函数的返回类型和形参类型不具体指定,用一个虚拟的类型代表
基本格式如下
template<typename 类型参数>
class 类名
{
类成员声明
};
或
template<class T>
class 类名
{
类成员声明
};
其中,template是一个声明模板的关键字,它表示声明一个模板。
类型参数实际上是一个虚拟的类型名,现在并未指定它的具体类型,但是用类模板时,必须进行实例化。
类型参数前需要加一个关键字typename或class,其作用相同,都是表示其后的参数是一个虚拟的类型名。
在用类模板定义对象时,采用以下形式
类模板名<实际类型名>对象名[(实参表列)];
类模板中的成员函数可以在类模板体外定义,此时,若成员函数中有类型参数存在,则要符合以下条件
1.需要在成员函数定义之前进行模板声明
2.在成语函数名前缀上"类名<类型参数>::"
一般形式如下:
template<typename 类型参数>
函数类型 类名 <类型参数> :: 成员函数名(形参表)
{
}
注意:
1.在每个类模板定义之前,都需要在前面加上模板声明,类模板在使用时,必须在类模板名字后面缀上<类型参数>
2.类模板可以有多个参数
异常处理
程序常见错误分为两大类:编译时的错误和运行时的错误。
程序在运行时的错误统称为异常,对异常的处理称为异常处理
方法
C++处理异常的方法是,若在执行函数时出现异常,则传递给上一级函数进行处理,逐级上传,若最后无法处理,则结束程序
C++处理异常的机制是由检查、抛出和捕获三部分组成,分别由三个语句组成try、throw、catch
异常抛出
异常抛出使用catch语句
格式为throw 表达式
若某段程序出现异常,则可使用throw语句抛出异常给调用者,并由该异常相对应的catch语句捕获
throw 语句的表达式表示抛出的异常类型,异常类型由表达式的类型表示
例
int Div(int x,int y)
{
if(y==0) throw y;
return x/y;
}
//当y=0时,抛出int型异常
异常的检查和捕获
异常的检查和捕获使用try和catch语句
格式为
try
{
被检查的复合语句
}
catch (异常类型声明1)
{
进行异常处理的复合语句1
}
......
catch (异常类型声明n)
{
进行异常处理的复合语句n
}
try 后的复合语句时被检查语句,也是容易引起异常的语句,这些语句称为代码的保护段。如果预料某段程序代码可能发生异常,则将其放在try后,若出现异常则其中的throw语句会抛出这个异常
catch用来捕获throw抛出的异常,catch子句后的复合语句是异常处理程序,异常类型声明部分指明了catch子句处理的异常类型,通过cathc捕获的异常类型来执行相应的异常处理程序
注意
1.被检测的语句或程序段必须放在try块中,否则不起作用
2.try和catch中必须有用花括号括起来的复合语句,即使花括号中只有一个语句也不能省略花括号
3.一个try语句可对应多个catch,但整个语句块中只能有一个try
4.若一个catch子句中没有指定异常信息的类型,而是使用了三点删节号"...",则表示可接受任意异常信息
5.在某些情况下,throw语句可以不包括表达式,此时它将再次抛出正在处理的异常信息至上一级
6.一个异常若没有被捕获,系统将调用系统函数terminate,尤其调用abort终止程序