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引擎用的,因此不能直 ...
随机推荐
- 关于webpack的面试题
随着现代前端开发的复杂度和规模越来越庞大,已经不能抛开工程化来独立开发了,如react的jsx代码必须编译后才能在浏览器中使用:又如sass和less的代码浏览器也是不支持的. 而如果摒弃了这些开发框 ...
- [译][ABP vNext]ABP CLI,v0.18版本的新模板和其他功能
ABP CLI,v0.18版本的新模板和其他功能 ABP v0.18已发布, 包含解决的70+个issue,500+次提交 网站更改 abp.io网站完全更新以突出ABP框架的目标和重要功能.文档和博 ...
- P3十进制转换为二进制
#include<stdio.h>int main () { int n; scanf("%d",&n); int a[8]; fo ...
- JWT签名与验签
签名Token生产 using System; using System.Collections.Generic; using System.IdentityModel.Tokens.Jwt; usi ...
- 大话设计模式Python实现-工厂方法模式
工厂方法模式(Factory Method Pattern):定义一个用于创建对象的接口,让子类决定实例化哪一个类,工厂方法使一个类的实例化延时到其子类. #!/usr/bin/env python ...
- SpringDataRedis简单入门介绍
1:问题引入 在实际开发中,开发的每一个项目,每天都有大量的人访问,对数据库造成很大的访问压力,甚至是瘫痪.那如何解决呢?我们通常的做法有两种:一种是数据缓存.一种是网页静态化.我们今天讨论第一种解决 ...
- 基于log4net的日志组件扩展封装,实现自动记录交互日志 XYH.Log4Net.Extend(微服务监控)
背景: 随着公司的项目不断的完善,功能越来越复杂,服务也越来越多(微服务),公司迫切需要对整个系统的每一个程序的运行情况进行监控,并且能够实现对自动记录不同服务间的程序调用的交互日志,以及通一个服务或 ...
- Blazor应用程序基于角色的授权
原文:https://chrissainty.com/securing-your-blazor-apps-configuring-role-based-authorization-with-clien ...
- Winform中设置ZedGraph多条Y轴时与多条曲线一一对应
场景 Winform中实现ZedGraph的多条Y轴(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/1001322 ...
- 宣布Visual Studio Code Installer for Java
自从第一个Java语言服务器在微软苏黎世办公室的一个小型会议室的黑客马拉松中开发已经差不多3年了,该会议室的人员来自Red Hat,IBM,Codenvy和Microsoft,后来成为Visual S ...