- 1、本文档共47页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章 模板 12.1 概述 12.2 函数模板 12.3 类模板 12.4 用类模板构造简单线性表 12.5 用类模板构造单向链表 12.1 概述 模板有两种: 一是 函数模板, 二是 类模板。 模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。 例12.1 求两个变量最小值的函数模板。 template class T T min(T a, T b) { return ab?a:b; } 然后,可以对多种数据类型求最小数。例如 求两个int型最小数: min(10,20); 求两个float型最小数: min(10.0, 20.0); 还可以编写一个类模板,然后让C++自动生成相关类的代码。例如,可以对堆栈类编写一个类模板,然后C++就可自动生成如int、float和string堆栈类的类模板。 例12.2 对堆栈类编写一个类模板。 堆栈类模板如下: template class T class Stack { private : T pool[maxNum]; int sp; public: Stack(); void Push(T x); T Pop(); BOOL IsEmpty() const; BOOL IsFull() const; }; 其使用如下: 实例化int型堆栈类: Stack int intStack; 实例化float型堆栈类:Stack float floatStack; 注意: 函数模板和类模板好比是具有各种形状的模板,而模板函数和模板类则是相当于按这个模板的样式,生成的各种具体的函数或类,即模板函数是将函数模板的参数实例化出具体的函数,模板类是将类模板的参数实例化成具体的具体类。 12.2 函数模板 C++提供的函数模板可以定义一个对任何类型变量进行操作的函数,从而大大增强了函数设计的通用性。使用函数模板的方法是先说明函数模板,然后实例化成相应的模板函数进行调用执行。 12.2.1 函数模板的定义 函数模板的一般说明形式如下: template 模板形参表 返回值类型 函数名(模板函数形参表) { //函数定义体 } 其中: 模板形参表可以包含基本数据类型,也可以包含类类型。类型形参需要加前缀class。如果类型形参多于一个,则每个类型形参都要使用class。 模板函数形参表中的参数必须是惟一的,而且在函数定义体中至少出现一次。 说明: 函数模板定义不是一个实实在在的函数,编译系统不为其产生任何执行代码。该定义只是对函数的描述,表示它每次都能单独处理在类型形式参数表中说明的数据类型,并根据调用的实际参数,实例化出实际的模板函数。 例12-3:编写一个对具有n个元素的数组a[ ]求最小值的程序,要求将求最小值的函数设计成函数模板。 #include iostream.h template class T T min(T a[],int n) { int i; T minv=a[0]; for(i=1;in;i++) if(minva[i]) minv=a[i]; return minv; } 12.2.2 函数模板的调用 函数模板只是说明,不能直接执行,需要实例化为模板函数后才能执行。 当编译系统发现有一个函数调用: 函数名(实参表); 时,将根据实参表中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而形参表的类型则以实参表的实际类型为依据。 在模板函数被实例化之前,必须在函数的某个地方首先说明它(可能不进行定义),这样,就可以到后面再定义模板。和一般函数一样,如果函数模板的定义在首次调用之前,函数模板的定义就是对它的说明。定义之后的首次调用就是对模板函数的实例化。 对模板函数的说明和定义必须是全局作用域。模板不能被说明为类的成员函数。 模板函数有一个特点,虽然模
文档评论(0)