《C++程序设计基础教程》模板和异常处理 ppt课件
合集下载
C++语言程序设计第10章异常处理PPT

10.2 异常处理机制
10.2 .2异常处理的任务
异常处理(catch)并不完全等同于对出错部 分的处理,还需要设计出符合应用需求的处理程序。 当出现与设计要求不符合的情况时,都可以认为是 异常,并对它进行异常处理。如,在输入学生成绩 时,如果成绩不符合约束条件,程序则报错(如: 输入错误,请重新输入),通过“重新输入”机制使 程序回到正常运行流程中。
10.1 异常处理的一个简单程序
13. catch(double) //异常处理程序 14. { 15. cout<<"Error:attempted to divid by zero!\n"; 16. } 17. cout<<"main Function end!"<<endl; 18.} 说明: (1)被检测的函数或代码块必须放在try块中,否则异常无 法捕捉; (2)try-catch必须作为一个整体出现,不能单独使用,次序 也不能前后颠倒,在二者之间也不能插入任何语句。 (3)try块内第三条语句没有被执行。因为第二条语句发生 异常,程序跳转到catch块内。
10.2 异常处理机制
10.2 .1 异常的概念 1.异常(Exception)是程序可能检测到的、运行时不正常的 情况,如被零除、数组越界、存储空间不足等等。 2.引入异常机制的目的: (1)异常是一种容错机制,给程序员提供了一种解决运行 时错误的方法。 (2)不是要把函数转变为一种容错的容器,而是要作为一 种机制,提供给子模块一种容错能力。 3.c++提供的异常处理try-catch-throw C++提供了内置的语言机制实现抛出(throw)异常,通知捕 捉的程序“异常已经发生”,然后由调用异常处理的程序段来 捕捉(catch)异常;当有异常发生时,对它进行相应的处理, 如果没有任何异常,则catch段的相应程序不会被执行
C程序设计基础-PPT课件

第二章 C程序设计基础
2.1 常量和变量
注意符:号常量在其作用域内不能再赋值。
符号常量的好处:(1)含义清楚。(2)需改变时,“一改全改”。
2024/10/14
1
2.1 常量和变量
注意:
1、变量中的值:变量必须要有值才能参与运算,(如果一个变量
没有赋值,则该变量是一个随机值)变量可以在定义后与其赋值,也可以
2024/10/14
16
2.3 运算符与表达式
逻辑运算符和逻辑表达式
符号
例子 0&&0=0、0&&1=0、1&&0=0、1&&1=1
0||0=0、0||1=1、1||0=1、1||1=1 !1=0、!0=1
使用说明: ➢1、逻辑非优先级高于逻辑与和逻辑或,逻辑与和逻辑或优先级相同; ➢2、C语言规定:非0都表示“真”,只有0表示“假”; 例:6<4&&7>-3+!5
14
2.3 运算符与表达式
赋值运算符与赋值表达式
符号
功能
例子
=
将表达式右边的数据赋值给左边的变量
x=3+a
+=
将表达式右边的计算结果加上左边的变 量再赋值给左边的变量
x+=3+a等价于x=x+(3+a)
-=
将表达式右边的计算结果减去左边的变 量再赋值给左边的变量
x-=3+a等价于x=x-(3+a)
6~7
双精度(double): 8B 10-308 ~ 10308 15~16
长双精度: 16B 10-4931 ~ 104932 18~19
2.1 常量和变量
注意符:号常量在其作用域内不能再赋值。
符号常量的好处:(1)含义清楚。(2)需改变时,“一改全改”。
2024/10/14
1
2.1 常量和变量
注意:
1、变量中的值:变量必须要有值才能参与运算,(如果一个变量
没有赋值,则该变量是一个随机值)变量可以在定义后与其赋值,也可以
2024/10/14
16
2.3 运算符与表达式
逻辑运算符和逻辑表达式
符号
例子 0&&0=0、0&&1=0、1&&0=0、1&&1=1
0||0=0、0||1=1、1||0=1、1||1=1 !1=0、!0=1
使用说明: ➢1、逻辑非优先级高于逻辑与和逻辑或,逻辑与和逻辑或优先级相同; ➢2、C语言规定:非0都表示“真”,只有0表示“假”; 例:6<4&&7>-3+!5
14
2.3 运算符与表达式
赋值运算符与赋值表达式
符号
功能
例子
=
将表达式右边的数据赋值给左边的变量
x=3+a
+=
将表达式右边的计算结果加上左边的变 量再赋值给左边的变量
x+=3+a等价于x=x+(3+a)
-=
将表达式右边的计算结果减去左边的变 量再赋值给左边的变量
x-=3+a等价于x=x-(3+a)
6~7
双精度(double): 8B 10-308 ~ 10308 15~16
长双精度: 16B 10-4931 ~ 104932 18~19
C++模板类设计和异常处理PPT演示课件

18
(3)在调用模板函数时,系统能 自动根据所给定的参数类型来生成相 应的函数,并进行调用。
19
9.1.2 类模板
在C++语言中,不但可以定义函数模 板,而且还可以定义类模板。下面,我们 看一下能够保存100个整数的堆栈类的设 计,通过对这样一个简单例子的学习,来 了解一下使用类模板的意义。
20
【例9.2】编一程序,用于实现能够管 理整型数据的堆栈类。
#include <iostream.h> class cStack {
int ct; int data[100];
21
public: cStack(void) {ct=0;} void push(int dt)
{
if (ct<100) data[ct++]=dt;
6
模板的定义 所谓模板,就是首先定义作为原型
的函数或类的框架,然后在需要时再根 据已定义的原型来生成具体的函数或类。
7
模板的类型 在C++语言中,模板分为两种: 函数模板 类模板
8
9.1.1 函数模板
函数模板的定义形式如下: template <模板参数表> 函数值类型 函数名 (参数表)
{ 函数体
第九章 模板和异常处理
9.1 模 板
1
在实际程序设计过程中,往往会发 现这样的现象:程序中所定义的两个或 多个函数的函数体完全一样,所不同的 只是它们的参数类型不一样。
2
求两个整型数的最小值
int iMin(int x, int y) {
int mv; mv=(x<y) ? x :y; return mv; }
16
(3)在调用模板函数时,系统能 自动根据所给定的参数类型来生成相 应的函数,并进行调用。
19
9.1.2 类模板
在C++语言中,不但可以定义函数模 板,而且还可以定义类模板。下面,我们 看一下能够保存100个整数的堆栈类的设 计,通过对这样一个简单例子的学习,来 了解一下使用类模板的意义。
20
【例9.2】编一程序,用于实现能够管 理整型数据的堆栈类。
#include <iostream.h> class cStack {
int ct; int data[100];
21
public: cStack(void) {ct=0;} void push(int dt)
{
if (ct<100) data[ct++]=dt;
6
模板的定义 所谓模板,就是首先定义作为原型
的函数或类的框架,然后在需要时再根 据已定义的原型来生成具体的函数或类。
7
模板的类型 在C++语言中,模板分为两种: 函数模板 类模板
8
9.1.1 函数模板
函数模板的定义形式如下: template <模板参数表> 函数值类型 函数名 (参数表)
{ 函数体
第九章 模板和异常处理
9.1 模 板
1
在实际程序设计过程中,往往会发 现这样的现象:程序中所定义的两个或 多个函数的函数体完全一样,所不同的 只是它们的参数类型不一样。
2
求两个整型数的最小值
int iMin(int x, int y) {
int mv; mv=(x<y) ? x :y; return mv; }
16
异常处理C程序设计课件

Try { } catch(type obj) { }
异常处理部分必须直接放在测试块之后。如果一个异常信 号被抛出,异常处理器中第一个参数与异常抛出对象相匹 配的函数将捕获该异常信号,然后进入相应的catch语句, 执行异常处理程序。catch语句与switch语句不同,它不需 要在每个case语句后加入break用以中断后面程序的执行。
异常匹配
当在程序中有异常抛出时,异常处理系统会根据异常处理 器的顺序找到最近的异常处理块,并不会搜索更多的异常 处理块。
异常匹配并不要求异常与异常处理器进行完美匹配,一个 对象或一个派生类对象的引用将与基类处理器进行匹配。 若抛出的是类对象的指针,则指针将会匹配相应的对象类 型,但不会自动转换成其他对象的类型。
标准异常
用于C++标准库的一些异常可以直接应用到程序中,应用 标准异常类会比应用自定义异常类要简单容易的多。如果 系统所提供的标准异常类并不能满足需要,不可以在这些 标准异常类基础上进行派生 class logic_error; //逻辑错误,在程序运行前可以检测出来 class domain_error; //违反了前置条件 class invalid_argument; //指出函数的一个无效参数 class length_error; //超长 class out_of_range; //参数越界 class bad_cast; //在运行时类型识别中有一个无效的 class bad_typeid; //报告在表达试typeid(*p)中有一个空指针p class runtime_error; //运行时错误,仅在程序运行中检测到 class range_error; //违反后置条件 class overflow_error; //报告一个算术溢出 class bad_alloc; //存储分配错误
《C程序设计教程》PPT课件

Biblioteka 19精选PPT10
gs_a对象
name
A类
A类数据成员
B类 对象
对象 成员
semesterHours
内存
average
结构
advisor
B对象成员
qualifierGrade
精选PPT
11
性质差异
继承(A继承B)
派生类A定义中看不到基类B的定义
派生类A对象中含基类B的成员
基类B中的private成员不能在派生类A中访问
精选PPT
4
10.2 访问父类成员
继承父类成员 父类成员在内存结构中存在于子类对象中, 所以父类成员在一定条件下可以被子类代 码或外部代码访问
类内访问控制
私有
保护
公有
精选PPT
5
类内访问控制
访问属 public
性
继承
public
public
protecte private d
protecte private d
圆的设计:圆点,半径,面积,周长,圆 的移动,半径的修改
新增成员:半径,面积计算,周长计算,移动 操作,半径修改操作
继承设计
圆是一个半径不为0的点。
组合设计
圆里有一个类型为Point的圆点
精选PPT
13
10.6 多继承概念
多继承结构 基类成员名冲突 基类分解
精选PPT
14
多继承结构
protected protected protecte private d
private private private private
精选PPT
6
10.3 派生类的构造
缺省构造 自定义构造 拷贝构造与赋值 对象构造顺序
gs_a对象
name
A类
A类数据成员
B类 对象
对象 成员
semesterHours
内存
average
结构
advisor
B对象成员
qualifierGrade
精选PPT
11
性质差异
继承(A继承B)
派生类A定义中看不到基类B的定义
派生类A对象中含基类B的成员
基类B中的private成员不能在派生类A中访问
精选PPT
4
10.2 访问父类成员
继承父类成员 父类成员在内存结构中存在于子类对象中, 所以父类成员在一定条件下可以被子类代 码或外部代码访问
类内访问控制
私有
保护
公有
精选PPT
5
类内访问控制
访问属 public
性
继承
public
public
protecte private d
protecte private d
圆的设计:圆点,半径,面积,周长,圆 的移动,半径的修改
新增成员:半径,面积计算,周长计算,移动 操作,半径修改操作
继承设计
圆是一个半径不为0的点。
组合设计
圆里有一个类型为Point的圆点
精选PPT
13
10.6 多继承概念
多继承结构 基类成员名冲突 基类分解
精选PPT
14
多继承结构
protected protected protecte private d
private private private private
精选PPT
6
10.3 派生类的构造
缺省构造 自定义构造 拷贝构造与赋值 对象构造顺序
C程序设计教程课件PPT课件

哈希查找
通过哈希函数将元素的关键字转 换为数组的索引,然后在对应位 置进行查找。时间复杂度为O(1)。
THANKS
感谢观看
选择排序
每次从未排序序列中选出最小 (或最大)元素,放到已排序
序列的末尾。时间复杂度为 O(n^2)。
插入排序
将未排序元素插入到已排序序 列中的适当位置,以达到排序 的目的。时间复杂度为O(n^2)。
常见排序算法实现原理及性能比较
快速排序
采用分治策略,通过一趟排序将待排序序列分割成独立的两部分,其中一部分的所有元素都比另一部分的 所有元素小,然后再对这两部分继续进行排序。时间复杂度为O(nlogn)。
示例1
使用fprintf()和fscanf()函数实现 文件的读写操作。
示例2
使用fgetc()和fputc()函数实现文 件的字符读写操作。
示例3
使用fgets()和fputs()函数实现文 件的字符串读写操作。
示例4
使用fread()和fwrite()函数实现 文件的数据块读写操作。
数据存储格式选择(如:文本、二进制)
01
文本格式
02
二进制格式
03
选择依据
将数据以字符形式存储,便于查看和编 辑,但占用空间较大。
将数据以二进制形式存储,占用空间较 小,读写效率高,但不便于直接查看和 编辑。
根据实际需求选择数据存储格式,如需 要频繁读写大量数据且对存储空间有要 求时,可以选择二进制格式;如需要方 便查看和编辑数据时,可以选择文本格 式。
算法概念及评价标准
算法概念
为解决特定问题而规定的一系列操作步骤,具有有穷性、确定性、可行性、输 入和输出五个基本特性。
评价标准
C程序设计基础PPT课件

03
栈和队列
栈和队列是两种特殊的数据结构,栈是一种后进先出的数据结构,队列是一种先进先出的数据结构。
数据结构基础
01
数据结构的基本概念
数据结构是计算机中存储和组织数据的方式,它包括数据的逻辑结构和物理结构。
02
数组和链表
数组和链表是两种基本的数据结构,数组是一种连续存储的数据结构,链表是一种非连续存储的数据结构。
链表是一种非连续存储的数据结构,它通过指针链接不同的节点。
链ቤተ መጻሕፍቲ ባይዱ的基本概念
链表的节点包括数据域和指针域,数据域存储数据,指针域存储下一个节点的地址。
链表的节点结构
链表的创建和销毁包括头插法、尾插法和删除等操作。
链表的创建和销毁
链表
栈的基本概念
栈与队列
栈的基本操作
队列的基本概念
队列的基本操作
06
C程序设计实例
要点一
要点二
关键字
C语言有32个关键字,这些关键字具有特殊含义,不能被用作变量名或函数名,包括if、else、while、for、switch等。
标识符与关键字
数据类型
C语言有多种数据类型,包括整型、浮点型、字符型、指针等,这些数据类型用于存储不同类型的数据。
变量
变量是用来存储数据的容器,每个变量都有一个名称和对应的数据类型,在C语言中,必须先定义变量的类型和名称,然后才能使用。
结构体的引用与操作
05
文件操作与数据结构
1
文件操作基础
2
3
文件是计算机中用于存储数据的单位,文件操作包括文件的创建、读取、写入、删除等。
文件操作的基本概念
文件的基本操作包括文件的打开、关闭、读取、写入等。
异常处理PPT课件

● InterruptedException(中断异常): 当前等待或睡眠线 程被其他线程中断时引发。
这类异常并非因设计或实现引起,是无法避免的。 但一般情况下,程序员应该提供相应的代码捕捉和 处理。
14
受检查的异常和不受检查的异常: 受检查的异常
Exception类及其非RuntimeException子类属于受 检查的异常;
9) System.out.println("After method.");
10) } 11) }
6
Exception in thread "main" ng.ArithmeticException: / by zero at ExceptionDivideBy0.method(ExceptionDivideBy0.java:4) at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8)
一般情况下,程序员可不必理会这类异常,它们 虽然很严重,但很少发生。
12
(2) RuntimeException类及其子类: 表示设计或实现 方面的问题,例如:
● ArithmeticException(算术运算异常): 算术运算时发生 的异常情况,如整数相除,除数为零。 ● ClassCastException(强制类型转换异常): 把一个对象 引用转换成一个不合适的类型,如把一个对象引用转换成某 个子类类型。 ● NullPointerException(空引用异常): 需要对象引用时使 用了一个null引用。 ● ArrayIndexOutOfBoundsException(数组下标越界异常): 下标值超出了数组大小。 ● NumberFormatException(数字格式异常): 试图将非数 字格式字符串转换成数值。
这类异常并非因设计或实现引起,是无法避免的。 但一般情况下,程序员应该提供相应的代码捕捉和 处理。
14
受检查的异常和不受检查的异常: 受检查的异常
Exception类及其非RuntimeException子类属于受 检查的异常;
9) System.out.println("After method.");
10) } 11) }
6
Exception in thread "main" ng.ArithmeticException: / by zero at ExceptionDivideBy0.method(ExceptionDivideBy0.java:4) at ExceptionDivideBy0.main(ExceptionDivideBy0.java:8)
一般情况下,程序员可不必理会这类异常,它们 虽然很严重,但很少发生。
12
(2) RuntimeException类及其子类: 表示设计或实现 方面的问题,例如:
● ArithmeticException(算术运算异常): 算术运算时发生 的异常情况,如整数相除,除数为零。 ● ClassCastException(强制类型转换异常): 把一个对象 引用转换成一个不合适的类型,如把一个对象引用转换成某 个子类类型。 ● NullPointerException(空引用异常): 需要对象引用时使 用了一个null引用。 ● ArrayIndexOutOfBoundsException(数组下标越界异常): 下标值超出了数组大小。 ● NumberFormatException(数字格式异常): 试图将非数 字格式字符串转换成数值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.1函数模板的定义
如:template <class T>
T GetMax (T a, T b){ return (a>b?a:b); }
函数模板定义中类型参数可以是一个,也可以是多个, 如果多于一个,则每个形参前都要加关键字typename(或 class),且各类型参数间用逗号隔开。如:
函数名(实参表);
编译器将根据用户给出的实参类型, 生成相应的重载函数。生成的重载函数 称为模板函数,是一个实实在在的函数。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
如: template <class T>
T GetMax (T a, T b){ return (a>b?a:b); }
《C++程序设计基础教程》
第9章
模板和异常处理
不管是过去、现在,还是将来,你们面对的任何竞争 和挑战,最大的对手不是别人,而是自己。
本章内容
第9章 模板和异常处理
函数模板
1
类模板
2
异常处理
3
程序举例
4
2020/2/27
第9章 模板和异常处理
模板常用于表达逻辑结构相同,但具体数据元 素类型不同的数据对象的通用行为,是实现代码 重用的一种工具,可以实现函数或类要处理的数 据类型参数化,表现为参数的多态性,即将类型 定义为参数,从而实现真正的代码可重用性。
<< endl ;
//输出9.01
return 0;
}
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
再如:
A行也可用如下语句:
template <typename T, typename U > i = GetMin (j,k);
T GetMin (T a, U b) { return (a<b? a: b); } 模板参数也可以设置缺
return 0;
}
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
【例9-1】定义一个冒泡排序法的函数模板。
程序设计
冒泡排序法的具体步骤为:依次比较相邻的两个数,即首先比较 第一个和第二个数,将小数放前,大数放后;然后比较第二个数和 第三个数,将小数放前,大数放后,如此继续,直至比较最后两个 数,将小数放前,大数放后。此时第一趟结束,最大的数放到了最 后。第二趟仍从第一对数开始比较,将小数放前,大数放后,一直 比较到倒数第二个数,第二趟结束,在倒数第二的位置上得到一个 第二大数。如此下去,重复以上过程,直至最终完成排序。
int main(){
省值,与为函数参数设
int i,j=555;
置缺省值类似。如:
char k=‘5’; i = GetMin <int, long> (j, k); //A
template <class T =value>
cout<<i<<‘\n’; //输出字符‘5’的ASCII码值53
//有一个默认值
考虑到数据序列的存储,函数模板中应有两个参数,一个是数据 序列的首地址,另一个是数据序列的长度。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
源程序代码
#include <iostream>
#include <cstring>
using namespace std;
模板有两种,一种是函数模板,另一种是类模 板。
不管是哪种模板都不是实实在在的类或函数, 而仅仅是对类或函数的描述。
2020/2/27
第9章 模板和异常处理
异常处理一般用在大型软件中,由于函数之 间有着明确的分工和复杂的调用关系,发现错 误的函数往往不具备处理错误的能力。此时异 常处理机制可将异常的检测与处理分离。
第9章 模板和异常处理
9.1.1函数模板的定义
函数模板可以生成通用的函数,这 些函数能够接受任意数据类型的参数, 可返回任意类型的值,而不需要对所 有可能的数据类型进行函数重载时的 匹配检查。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
函数模板定义后,可以直接用实参代 替函数模板定义中的形参,来实现对该 函数的调用。具体形式为:
template <typename ElementType >
//定义模板函数
void SortBubble ( ElementType *a , int size ){
int i, work ;
当在一个函数体中检测到异常条件存在,但 却无法确定相应的处理方法时,该函数将引发 一个异常,由函数的直接或间接调用者捕获这 个异常并处理这个错误。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.1函数模板的定义
函数模板是一个通用函数,其函 数类型和形参类型不具体指定,而是 用一个虚拟的类型来代表。
函数模板并不是真正的函数,只是 一种产生多种函数的模式或者框架。
2020/2/27
9.1函数模板
第9章 模板和异常处理
9.1.1函数模板的定义
函数模板定义的一般格式如下:
template <typename T> 函数类型 函数名(形参列表) {
函数体 }
这里,template是关键字,表示声明一个模板; 尖括号中不能为空,其中typename(或使用 class)是类型参数说明关键字;T是类型参数。
template <typename T, typename U >
T GetMin (T a, U b) { return (a<b? a: b); }
此时函数 GetMin可以接受两个不同类型的参数,通过T 和U来区分,结果将返回一个与第一个参数同类板
int main ( ){
cout << " GetMax ( 7 , 2 )=" << GetMax ( 7 , 2 ) << endl ;
//输出7
cout << " GetMax ( 'p' , 'Q' )=" << GetMax ( 'P' , 'Q' )
<< endl ;
//输出字符Q
cout << " GetMax ( 3.2 , 9.01 )=" << GetMax ( 3.2 , 9.01 )
9.1 函数模板
第9章 模板和异常处理
9.1.1函数模板的定义
如:template <class T>
T GetMax (T a, T b){ return (a>b?a:b); }
函数模板定义中类型参数可以是一个,也可以是多个, 如果多于一个,则每个形参前都要加关键字typename(或 class),且各类型参数间用逗号隔开。如:
函数名(实参表);
编译器将根据用户给出的实参类型, 生成相应的重载函数。生成的重载函数 称为模板函数,是一个实实在在的函数。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
如: template <class T>
T GetMax (T a, T b){ return (a>b?a:b); }
《C++程序设计基础教程》
第9章
模板和异常处理
不管是过去、现在,还是将来,你们面对的任何竞争 和挑战,最大的对手不是别人,而是自己。
本章内容
第9章 模板和异常处理
函数模板
1
类模板
2
异常处理
3
程序举例
4
2020/2/27
第9章 模板和异常处理
模板常用于表达逻辑结构相同,但具体数据元 素类型不同的数据对象的通用行为,是实现代码 重用的一种工具,可以实现函数或类要处理的数 据类型参数化,表现为参数的多态性,即将类型 定义为参数,从而实现真正的代码可重用性。
<< endl ;
//输出9.01
return 0;
}
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
再如:
A行也可用如下语句:
template <typename T, typename U > i = GetMin (j,k);
T GetMin (T a, U b) { return (a<b? a: b); } 模板参数也可以设置缺
return 0;
}
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
【例9-1】定义一个冒泡排序法的函数模板。
程序设计
冒泡排序法的具体步骤为:依次比较相邻的两个数,即首先比较 第一个和第二个数,将小数放前,大数放后;然后比较第二个数和 第三个数,将小数放前,大数放后,如此继续,直至比较最后两个 数,将小数放前,大数放后。此时第一趟结束,最大的数放到了最 后。第二趟仍从第一对数开始比较,将小数放前,大数放后,一直 比较到倒数第二个数,第二趟结束,在倒数第二的位置上得到一个 第二大数。如此下去,重复以上过程,直至最终完成排序。
int main(){
省值,与为函数参数设
int i,j=555;
置缺省值类似。如:
char k=‘5’; i = GetMin <int, long> (j, k); //A
template <class T =value>
cout<<i<<‘\n’; //输出字符‘5’的ASCII码值53
//有一个默认值
考虑到数据序列的存储,函数模板中应有两个参数,一个是数据 序列的首地址,另一个是数据序列的长度。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
源程序代码
#include <iostream>
#include <cstring>
using namespace std;
模板有两种,一种是函数模板,另一种是类模 板。
不管是哪种模板都不是实实在在的类或函数, 而仅仅是对类或函数的描述。
2020/2/27
第9章 模板和异常处理
异常处理一般用在大型软件中,由于函数之 间有着明确的分工和复杂的调用关系,发现错 误的函数往往不具备处理错误的能力。此时异 常处理机制可将异常的检测与处理分离。
第9章 模板和异常处理
9.1.1函数模板的定义
函数模板可以生成通用的函数,这 些函数能够接受任意数据类型的参数, 可返回任意类型的值,而不需要对所 有可能的数据类型进行函数重载时的 匹配检查。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.2函数模板的使用
函数模板定义后,可以直接用实参代 替函数模板定义中的形参,来实现对该 函数的调用。具体形式为:
template <typename ElementType >
//定义模板函数
void SortBubble ( ElementType *a , int size ){
int i, work ;
当在一个函数体中检测到异常条件存在,但 却无法确定相应的处理方法时,该函数将引发 一个异常,由函数的直接或间接调用者捕获这 个异常并处理这个错误。
2020/2/27
9.1 函数模板
第9章 模板和异常处理
9.1.1函数模板的定义
函数模板是一个通用函数,其函 数类型和形参类型不具体指定,而是 用一个虚拟的类型来代表。
函数模板并不是真正的函数,只是 一种产生多种函数的模式或者框架。
2020/2/27
9.1函数模板
第9章 模板和异常处理
9.1.1函数模板的定义
函数模板定义的一般格式如下:
template <typename T> 函数类型 函数名(形参列表) {
函数体 }
这里,template是关键字,表示声明一个模板; 尖括号中不能为空,其中typename(或使用 class)是类型参数说明关键字;T是类型参数。
template <typename T, typename U >
T GetMin (T a, U b) { return (a<b? a: b); }
此时函数 GetMin可以接受两个不同类型的参数,通过T 和U来区分,结果将返回一个与第一个参数同类板
int main ( ){
cout << " GetMax ( 7 , 2 )=" << GetMax ( 7 , 2 ) << endl ;
//输出7
cout << " GetMax ( 'p' , 'Q' )=" << GetMax ( 'P' , 'Q' )
<< endl ;
//输出字符Q
cout << " GetMax ( 3.2 , 9.01 )=" << GetMax ( 3.2 , 9.01 )