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引擎用的,因此不能直 ...
随机推荐
- 【CodeForces】CodeForcesRound576 Div1 解题报告
点此进入比赛 \(A\):MP3(点此看题面) 大致题意: 让你选择一个值域区间\([L,R]\),使得序列中满足\(L\le a_i\le R\)的数的种类数不超过\(2^{\lfloor\frac ...
- ORB-SLAM2 地图加载2
补充SystemSetting和InitKeyFrame两个类的代码.实际上,由于是通过SystemSetting来读取的相机内参以及ORB特征参数,所以就可以将Tracking.cc中关于读取内参的 ...
- RedisHelper (C#)
<add key="RedisServers" value="172.20.2.90:9379,password=Aa+123456789" /> ...
- (四十二)golang--协程之间通信的方式
假设我们现在有这么一个需求: 计算1-200之间各个数的阶乘,并将每个结果保存在mao中,最终显示出来,要求使用goroutime. 分析: (1)使用goroutime完成,效率高,但是会出现并发/ ...
- 海边拾贝-B-优秀博客/网站
记下若干优秀博客,方便后期检索.会不定期更新: 优秀的程序员,从使用Github开始:https://help.github.com/en/github/managing-your-work-on-g ...
- HTTP和RPC是现代微服务架构,HTTP和RPC是现代微服务架构
.NET Core使用gRPC打造服务间通信基础设施 一.什么是RPC rpc(远程过程调用)是一个古老而新颖的名词,他几乎与http协议同时或更早诞生,也是互联网数据传输过程中非常重要的传输机制 ...
- 小程序开发笔记(八)—Js数组按日期分组显示数据
数据分组展示有两种方式,一种是后端直接传入分组格式的Json数据,另一种是我们在前端自己转换格式,这里我们在前端处理转换按日期分组的数据格式 1.例如后端返回数据格式为: [{createtime:' ...
- 『公交线路 状压dp 矩阵乘法加速』
公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1km. 作为公交车线路的规划者,小Z调查了市民的 ...
- IDEA创建xml文件
今天在用IDEA写项目的时候发现,创建xml文件只能通过File手动输入去创建,但在我看的一个学习视频上可以直接创建xml文件,好奇之下研究了一下,作此篇,希望能对需要的朋友有所帮助. 废话就不多说了 ...
- Abap内表
什么是内表:内表是内存中建立的一个临时表,你可以在程序运行时对表中的数据进行,插入,修改,删除等操作,程序跑完了,就会被释放. 定义类型:通过types开头定义 TYPES: BEGIN OF lin ...