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终止程序
C++面向对象程序设计学习笔记(7)的更多相关文章
- C++面向对象程序设计学习笔记(1)
基本概念 对象: 面向对象程序设计中,对象是描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体,每个对象都是由数据和操作代码两部分构成的. 类: 面向对象程序设计中,类是具有相同的数据 ...
- C++面向对象程序设计学习笔记(6)
多态性 编译时的多态性与运行时的多态性 在面向对象方法中,所谓多态性就是不同对象收到相同信息时,产生不同的行为.在c++程序设计中,即"一个接口,多种方法" 在C++中,多态性的实 ...
- C++面向对象程序设计学习笔记(5)
派生类与继承 概念 继承允许编程者在已有类的基础上创建新的类,可以从一个或者多个已有类中继承函数和数据,并重新定义或者添加新的函数和数据,已有类称为基类或父类,新类称为派生类和子类. 声明 声明一个派 ...
- C++面向对象程序设计学习笔记(4)
类与对象(2) string类 C++不仅向下兼容C的字符表示方法,也声明了一种更方便的字符串类型,即string类. 想要使用string类,必须包括头文件string,即要声明 #include& ...
- C++面向对象程序设计学习笔记(3)
类与对象(1) 结构体与类 结构体的扩充 C++对结构体进行了扩充,它不仅可以含有不同类型的数据,还可以含有函数,结构体的函数可以像访问结构体中的数据一样进行访问. 类的声明 声明类的方法与声明结构体 ...
- C++面向对象程序设计学习笔记(2)
C++在非面向对象方面的扩充 C++向下兼容C语言,因此C语言中的语法在C++中依然成立 输入输出 C++添加了标准输入流对象cin和标准输出流对象cout来进行输入输出, 例: #include&l ...
- 20145213《Java程序设计学习笔记》第六周学习总结
20145213<Java程序设计学习笔记>第六周学习总结 说在前面的话 上篇博客中娄老师指出我因为数据结构基础薄弱,才导致对第九章内容浅尝遏止地认知.在这里我还要自我批评一下,其实我事后 ...
- Java程序设计学习笔记(一)
时间:2015-6-2 23:04 程序员,程序猿,程序媛,码农 ------------------------------------------------------- --Java的应用 ...
- JavaScript高级程序设计---学习笔记(二)
面向对象程序设计1.属性类型.定义多属性.读取属性特性对象的属性在创建时都带有一些特征值,JavaScript通过这些特征值来定义它们的行为.这些特性是为了实现JavaScript引擎用的,因此不能直 ...
随机推荐
- Kubernetes集群的安全机制
集群的安全性需要考虑以下几个目标: 1.保证容器与其所在宿主机的隔离 2.限制容器给基础设施及其他容器带来的消极影响的能力 3.最小权限原则——合理限制所有组件的权限,确保组件只执行它被授权的行为 4 ...
- 数据仓库001 - 复习Linux shell命令 - pwd mkdir mv tail -f xxx.log 和 ail -F xxx.log
1. [root@localhost ~]# 的含义 ? [登录的用户 机器的名称 家目录] 2. 查看当前光标所在的目录 pwd [root@localhost ~]# pwd /roo ...
- 【ECharts】1.学习ECharts从现在开始:第一个Echart图形
首先,你需要下载ECharts所需的文件,我使用的是echarts-2.0.2版本,点击这里下载:echarts-2.0.2 下载解压后,下面有一系列文件夹,其中build中有我们需要引入的JS文件, ...
- (三十四)golang--接口
golang的多态特性主要体现在接口上: 主要优势:高内聚低耦合: package main import ( "fmt" ) type usb interface { start ...
- iOS性能优化-数组、字典便利时间复杂
上图是几种时间复杂度的关系,性能优化一定程度上是为了降低程序执行效率减低时间复杂度. 如下是几种时间复杂度的实例: O(1) return array[index] == value; 复制代码 O( ...
- Visual Studio 2019 (VS2019)正式版安装 VisualSVN Server 插件
VS2019 正式版最近刚刚推出来,目前 Ankhsvn 还不支持,它最高只支持 VS2017,全网搜索了一下,也没有找到.在 Stackoverflow 上看了一下,找到这篇问答: 自己按照这种方法 ...
- ssh遇到port 22:No route to host问题的解决方法
一 iptables 问题 1.没有安装,可以先安装 yum install iptables 2.防火墙的开启与关闭 即时生效,重启失效 service iptables start(开启) ser ...
- QGIS中查看PostGIS空间数据库中的影像
在QGIS中的Browser中是无法显示PostGIS空间数据库中的影像 要找到影像显示打开"Database" –> "DB Manager" 右击-- ...
- 升级GCC
1. wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.4/gcc-4.9.4.tar.gz 2. tar -zxvf gcc-4.9.4.tar.gz 3. cd gc ...
- webapi 集成swagger
参考资料:Stack Overflow 我自己写的demo:SwaggerDemoApi 在已有的webapi项目或者创建webapi项目中,打开nuget管理器 搜索:swagger 安装截图中的插 ...