一. 模板的概念
模板是实现代码重用机制的一种工具,它把类型定义为参数,实现类型参数化,从而实现了代码的重用
模板分为函数模板和类模板,分别允许用户构造模板函数和模板类
二. 函数模板与模板函数
1. 所谓函数模板,实际上是建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板
2. 在调用函数时系统会根据实参的类型(模板实参)来取代模板中虚拟类型从而实现了不同函数的功能。
3. 函数模板经实例化而生成的具体函数称为模板函数。
4. 函数模板代表了一类函数,
5. 模板函数表示某一具体的函数。
6. 函数模板声明如下:
template < typename 类型参数> 返回类型 函数名(模板形参表) { 函数体 } /*template是声明模板的关键字,类型参数是一个虚拟的类型名,常用T,Tybe表示,使用函数模板时无论是typename还是class后面的类型参数,都必须实例化,用实际的数据类型(既可以使系统预定义的标准数据类型,也可以是用户自定义的类型)替代它*/
也可以定义成:
template <class 类型参数> 返回类型 函数名(模板形参表) { 函数体 }
7. 将函数模板中的类型参数实例化的参数称为模板实参。
8. 在函数模板中允许使用多个类型参数。但是应当注意template定义部分的每个类型参数前必须有关键字typename (或class )。
9. 建立了有两个类型参数的函数模板。
#include<iostream> using namespace std; template < typename type1, typename type2> void myfunc( type1 x, type2 y) { cout<<x<<’ ’<<y<<endl; } int main() { myfunc(10, "hao"); myfunc(0.123, 10L); return 0; }
10. 在template语句与函数模板定义语句之间不允许有别的语句,例如下面的程序段就不能编译。
template <typename T> int i; //错误 T max( T x,T y ) { return ( x>y)?x∶y; }
11. 模板函数类似于普通重载函数,但更严格一些。
12. 普通的非模板函数被重载的时候,在每个函数体内可以执行不同的动作。
13. 但同一函数模板实例化后的所有模板函数都必须执行相同的动作。
14. 函数模版也可以重载
15. 函数模板与同名的非模板函数可以重载。在这种情况下,调用的顺序是:
首先寻找一个参数完全匹配的非模板函数,如果找到了就调用它;
若没有找到,则寻找函数模板,将其实例化,产生一个匹配的模板函数,若找到了,就调用它。
请登录之后再进行评论