06第6章模板与异常处理.pptVIP

  • 1
  • 0
  • 约5.24千字
  • 约 26页
  • 2017-02-12 发布于重庆
  • 举报
06第6章模板与异常处理

高级程序设计语言 II 天津理工大学计算机与通信工程学院 主讲教师:孙世温 sunsw80@ 本章主要内容 模板的概念 函数模板 定义 实例化 类模板 定义 实例化 继承 本章小结 模板的概念 函数模板 定义 实例化 类模板 定义 实例化 继承 第6章 模板与异常处理 学时:1+1 模板的基本思想: 实际应用中,一些函数的功能相同,唯一的区别只在于处理对象的数据类型不同,若用函数重载实现,则需编写多个函数: 例:int max(int i, int j) { return ij?i:j; } float max(float i, float j) { return ij?i:j; } 编程时只提供一套实现该功能的程序实体,然后将数据类型作为参数传递,这就是类属机制的思想 模板具有模板形式参数:将数据类型作为模板的参数,参数化的数据类型就是形式类属参数 模板须经过实例化后才能使用:实例化是指用某一具体数据类型替代模板中的形式参数的过程,该确定的数据类型称为实际参数。 C++语言的模板 函数模板 函数的形式参数表中某些形式参数的数据类型被参数化 函数模板本身不是函数,经实例化后才得到函数 C++语言的模板 类模板 类的数据成员的类型或成员函数的形参类型被参数化 类属类也不是类,经实例化后才得到具体的类 §6.2 函数模板 一般形式: template class 类属参数1, class 类属参数2, … 函数类型 函数名(形参表) { 函数体… } 例: template class TYPE TYPE max(TYPE x, TYPE y) { return (x y) ? x : y; } 函数模板定义时应注意的问题 在函数模板定义template中给出的每一个形式类属参数都必须出现在函数形参表中 如: template class T1, class T2 void fun(T1 x, T2 y) { …… } 错误的用法 template class TYPE template class TYPE TYPE* func() void func() { ……} { TYPE obj; …… } 对于类模板的成员函数则不做此项要求 函数模板的实例化 由编译系统根据函数调用的实际参数类型自动完成函数模板的实例化,不须显式实例化 template class TYPE TYPE max(TYPE x, TYPE y) { return (x y) ? x : y; } void main( ) { MY_CLASS obj1, obj2; max(10, 5); // 用整型实例化 max(obj1, obj2); // 用MY_CLASS实例化 } 调用类属函数时,应保证函数的实参类型与形式类属参数完全匹配,因为函数模板在实例化过程中不做任何类型转换 例:已知函数模板max的两个形参都是形式类属参数TYPE类型的,则以下两个应用错误 max(10, 10.5); 一个实参是整型,另一个是double型,类型不同 max(10, obj1); 一个实参是整型,另一个是MY_CLASS类型 都无法实例化 二、模板函数的重载 例: #include iostream.h template class TYPE TYPE max(TYPE x, TYPE y) { return (x=y)?x:y; } template class TYPE TYPE max(TYPE x, TYPE y, TYPE z) { TYPE w = (x=y)?x:y ; return (w=z)?w:z; } template class TYPE TYPE max(TYPE x[], int n) { TYPE m = x[0]; for (int i=0; in; i++) if (mx[i]) m = x[i]; return m; } void main() { float m, x=56, y=-55.8, z=99.1; int data[10] = {1,3,15,7,9,22,4,26,8,10}; m = max(x, y); // TYPE被实例化为float m = max(x,y,z); int t = max(data, 10); } 在引入模板函数后,确定调用函数的哪个版本所遵循的匹配原则: (1)如果某一普通函数的形参类型正好与函数调用的实际参数类型匹配,则调用该函数。否则, (2)如果能从同名的模板函数实例化

文档评论(0)

1亿VIP精品文档

相关文档