C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章

上传人:E**** 文档编号:89342816 上传时间:2019-05-23 格式:PPT 页数:182 大小:1.07MB
返回 下载 相关 举报
C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章_第1页
第1页 / 共182页
C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章_第2页
第2页 / 共182页
C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章_第3页
第3页 / 共182页
C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章_第4页
第4页 / 共182页
C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章_第5页
第5页 / 共182页
点击查看更多>>
资源描述

《C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 李兰_ 第7章(182页珍藏版)》请在金锄头文库上搜索。

1、7.1 模板的概念(Templates Concept) 7.2 函数模板与模板函数 (Function Template and Template Function) 7.3 类模板与模板类 (Class Template and Template Class) 7.4 标准模板库STL(Standard Template Library) 7.5 常见编程错误(Common Programming Errors) 本章小结(Chapter Summary) 习题7(Exercises 7),模板是C+ 语言的一个重要特性。模板使得程序员能够快速建立具有类型安全的类库集合和函数集合,是通用程

2、序设计的利器。它的实现,提供了重用程序源代码的有效方法,方便了更大规模的软件开发。,7.1 模 板 的 概 念 (Templates Concept),但宏定义有两个问题,一是它避开了类型检查,在某些情况下,会导致不同类型参数之间的比较,引起错误;二是可能在不该替换的地方进行了替换,如: class A int max(int x,int y); / ,同样,在声明了一个类模板之后,可以创建类模板的实例,它称为模板类。类模板与模板类的区别是:类模板是一个模板,不是一个实实在在的类,其中用到通用类型参数;而模板类是一个类,可以由它定义对象。 模板经过实例化后就得到模板函数或模板类,模板函数或模板

3、类再经过实例化后就得到对象。模板、模板类、对象和模板函数之间的关系如图7-1所示。,图7-1 模板、模板类、对象和模板函数之间的关系,7.2.1 函数模板的声明 (Declaration of Function Template) 为了定义函数模板或类模板,首先要进行模板说明,其作用是说明模板中使用的类属参数。函数模板可以用来创建一个通用的函数,以支持多种不同的形参,避免重载函数的函数体重复设计。它的最大特点是把函数使用的数据类型作为参数。,7.2 函数模板与模板函数 (Function Template and Template Function),函数模板的声明形式为: template

4、(参数表) 函数体 ,例如: template T fuc(T x, int y) T x; / ,如果主调函数中有以下语句: double d; int a; fuc(d,a); 则系统将用实参d的数据类型double去代替函数模板中的T生成函数: double fuc(double x,int y) double x; / ,7.2.2 函数模板(Function Template) 函数模板定义由模板说明和函数定义组成。所有在模板说明的类属参数必须在函数定义中至少出现一次。函数参数表中可以使用类属类型参数,也可以使用一般类型参数。,7.2.3 模板函数(Template Function

5、) 函数模板是对一组函数的描述,它以类型作为参数及函数返回值类型。它不是一个实实在在的函数,编译时并不产生任何执行代码。当编译系统在程序中发现有与函数模板中相匹配的函数调用时,便生成一个重载函数。该重载函数的函数体与函数模板的函数体相同,参数为具体的数据类型。我们称该重载函数为模板函数,它是函数模板的一个具体 实例。,【例7-1】 求两个数之中的大值。 程序如下: /ex7_1.cpp /Max.h #include #include using namespace std; #ifndef MAX_H #define MAX_H,template T Max(T a, T b) return

6、 ab ? a : b; #endif void main() int a,b; cout a b;,cout x y; cout c d;,cout gf; cout “Max(“ g “,“ f “) = “ Max(g,f) endl; ,程序的运行结果为: Enter two integer: 12 45 Max(12,45)=45 Enter two double: 3.5 8.4 Max(3.5,8.4) = 8.4,Enter two character: A b Max(A,b)=b Enter two strings : good better Max(good,better

7、)=good,C+语言将根据“实参表”中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而“形参表”的类型则以“实参表”的实际类型为依据。 图7-2给出了函数模板和模板函数的关系示意。其中的重载函数,通过函数模板按实际类型生成模板函数,这个过程称为实例化。编译程序实例化后的模板函数自动生成目标 代码。,图7-2 函数模板与模板函数,【例7-2】 分析以下程序中的错误。 #include using namespace std; template T Min(T a, T b ) return ab ? a : b ; ,void main() int n=3;

8、char d=a; double w=2.4; coutmin(n,n)endl; coutmin(d,d)endl; coutmin(w,w)endl; /error coutmin(n,w)endl; /error coutmin(d,w)endl; /error ,【例7-3】 定义冒泡排序法的函数模板。 程序如下: #include using namespace std; #include #include,template /模板说明 void SortBubble (ElementType *a, int size) /具有类属类型参数和整型参数的参数表 int i, work

9、; ElementType temp ; /类属类型变量 for (int pass = 1; pass size; pass +) /对数组排序, work = 1; for (i = 0; i ai+1) temp = ai; ai = ai+1; ai+1 = temp; work = 0; if ( work ) break; ,void main() int a10; srand(time(0); /调用种子函数 for(int i = 0; i10; i+) ai = rand() % 100; /用随机函数初始化数组 for(i = 0; i10; i+) cout ai “ ”

10、; /输出原始序列 cout endl; SortBubble(a, 10); /调用排序函数模板 cout “After Order:” endl; for(i = 0; i10; i+) cout ai “ ”; /输出排序后序列 cout endl; ,程序运行结果为: 83 55 71 24 96 18 97 64 92 77 Afrer Order: 18 24 55 64 71 77 83 92 96 97,7.2.4 重载函数模板 (Overloading Function Template) 模板函数与重载是密切相关的。实际上,从函数模板产生的相关函数都是同名的,因此C+编译系

11、统采用重载的方法调用相应函数。 函数模板本身可以用多种方式重载,这需要提供其他函数模板,指定不同参数的相同函数名。,【例7-4】 使用函数模板求最大值的程序。 程序如下: #include using namespace std; template T max(T m1, T m2) return (m1m2) ? m1 : m2; ,template T max(T m1, T m2, T m3) T temp=max(m1,m2); return max(temp , m3); template T max(T a, int n) ,T maxnum=a0; for (int i=0;in

12、 ;i+) if(maxnumai) maxnum=ai; return maxnum; void main() double d=6.6,7.3,5.4,8.8,4.2,7.1,6.9,3.7,1.8,3.5; int a=-7,-6,-4,12,-9,2,-11,-8,-3,18;,char c=“goodmorning“; cout“ “max(12.9,5.4)“ “max(12,28) “ “max(p,m)endl ; cout“ max(16,34,52)=“ max(16,34,52)endl “max(16.2,34.5,52.3) =“ max(16.2,34.5,52.3

13、)endl “max(D,B,E) =“ max(D,B, E)endl; cout“intarrmax=“max(a,10)“ doublemax=“max(d,10) “ charmax =“max(c,10)endl; ,程序运行结果为: 12.9 28 p max(16,34,52)=52 max(16.2,34.5,52.3)=52.3 max(D, B, E)=E intarrmax=18 doublemax=8.8 charmax=r,用户可以用一个非模板函数重载一个同名的函数模板,例如,可以这样定义: template T max(T a, T b) return (ab)?

14、a :b; int max(int, int); /显式地声明函数max(int, int),不是模板函数 void f(int i, char c) ,max(i,i); /调用函数max(int, int) max(c,c); /调用模板max(char,char) max(i,c); /调用函数max(int,int) max(c,i); /调用函数max(int, int) ,这里,非模板函数max(int, int)重载了上述的函数模板max(T a, T b),当出现调用语句: max(i,c);和max(c,i);时,它执行的是重载的非模板函数版本max(int, int)。还可

15、以定义如下函数: char max(char * x, char * y) return(strcmp(x,y)0)?x :y; ,7.3.1 类模板的定义 (Definition of Class Template) 类模板的成员函数被认为是函数模板,也称为类属函数。因此,当给出一个类模板的成员函数的定义时,必须遵循函数模板的定义。,7.3 类模板与模板类 (Class Template and Template Class),定义类模板的一般格式如下: template class 类名 类声明体; ; template 类型形参表 返回类型 类名 类型名表:成员函数(形参表) 成员函数定义体; ,【例7-5】 求一个数的平方是算法中经常要用到的基本单元。对于int型和double型分别需要两个类来实现,类Square1实现求int型数据的平方,类Square2实现求double型数据的平方。如果采用类模板来实现,则只需要一次即可以实现。,程序如下: class Square1 public: Square1(int y):x(y) i

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号