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引擎用的,因此不能直 ...
随机推荐
- luogu4570 元素
题目链接 problem 有\(n\)个二元组, \((x,y)\),要选出一些二元组,使得他们的\(x\)的任何一个子集的异或和不为\(0\)并且\(y\)的和最大. solution 考虑是\(x ...
- Paper | Spatially Adaptive Computation Time for Residual Networks
目录 摘要 故事 SACT机制 ACT机制 SACT机制 实验 发表在2017年CVPR. 摘要 在图像检测任务中,对于图像不同的区域,我们可以分配不同层数的网络予以处理. 本文就提出了一个基于Res ...
- python 机器学习基础教程——第一章,引言
https://www.cnblogs.com/HolyShine/p/10819831.html # from sklearn.datasets import load_iris import nu ...
- Python爬取信息管理系统计算学分绩点
试手登录了下我们学校的研究生信息管理系统,自动计算学分绩点 # -*- coding:utf-8 -*- import urllib import urllib2 import re import c ...
- Azure Automation (7) 执行Azure SQL Job
<Windows Azure Platform 系列文章目录> 之前Automation介绍的内容,是在ASM模式下自动化开关机. 本章将介绍如何在Automation中,设置开关机脚本, ...
- (四十一)golang--goroutine
首先得了解: 进程 线程 并发 并行 Go协程和Go主线程: 主线程:相当于进程:直接作用于cpu上,是重量级的,是物理态的: 协程:相当于轻量级的线程:由主协程开启,是逻辑态的: Go协程的特点: ...
- C# - VS2019 WinFrm应用程序连接Access数据库,并简单实现数据库表的数据查询、显示
序言 众所周知,Oracle数据库和MySQL数据库一般在大型项目中使用,在某些小型项目中Access数据库使用较为方便,今天记录一下VS2019 WinFrm应用程序连接Access数据库,并实现数 ...
- 高效并发一 Java内存模型与Java线程(绝对干货)
高效并发一 Java内存模型与Java线程 本篇文章,首先了解虚拟机Java 内存模型的结构及操作,然后讲解原子性,可见性,有序性在 Java 内存模型中的体现,最后介绍先行发生原则的规则和使用. 在 ...
- 【设计模式】Prototype
前言 这篇讲设计模式的部分相对较少.Prototype设计模式,它提供一种复制对象的思路.使用Prototype就可以在不需要了解类结构的前提下,复制一个现有对象.写了一个代码片段,讲解使用Objec ...
- LeetCode——Department Highest Salary(花式使用IN以及GROUP BY)
The Employee table holds all employees. Every employee has an Id, a salary, and there is also a colu ...