模板使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递
C++提供两种模板机制: 函数模板 类模板
template < 类型形式参数表 >
类型形式参数表 :
typename T1 , typename T2 , …… , typename Tn 或 class T1 , class T2 , …… , class Tn
template < 类型形式参数表 >
类型 函数名 ( 形式参数表 )
{ 语句序列
}
Ø 函数模板定义由模板说明和函数定义组成
Ø 模板说明的类属参数必须在函数定义中至少出现一次
Ø 函数参数表中可以使用类属类型参数,也可以使用一般类型参数
Ø 寻找和使用最符合函数名和参数类型的函数,若找到则调用它;
Ø 否则,寻找一个函数模板,将其实例化产生一个匹配的模板函数,若找到 则调用它;
Ø 否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它
Ø 如果按以上步骤均未能找到匹配函数,则调用错误。
Ø 如果调用有多于一个的匹配选择,则调用匹配出现二义性。
template <类型形式参数表>
类声明
template< typename Type >
class TClass
{ // TClass的成员函数
private :
Type DateMember ;
//…
};
Ø函数的形式参数类型可以是类模板或类模板的引用,对应的实际参数是该类模板实例化的模板类对象
Ø 当一个函数拥有类模板参数时,这个函数必定是函数模板
Ø一个类模板在类层次结构中既可以是基类也可以是派生类:
Ø 类模板可以从类模板,或从普通类(非模板类)派生;
Ø 模板类可以从类模板或从普通类派生。
Ø 当一个类模板从普通类派生时,意味着派生类增加了类属参数;
Ø 当一个模板类从类模板派生时,意味着派生类继承基类时提供了实例化的类型参数。
类模板与友元成员
Ø 一个函数或函数模板可以类是或类模板的友元
Ø 一个类或类模板可以是类或类模板的友元类
Ø 声明这种模板之间的友元关系符号比较烦琐
类模板与static成员
Ø从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员
Ø 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化
Ø 每个模板类有自己的类模板的static数据成员副本
实例化的类模板称为模板类。实例化的函数模板称为模板函数。
Ø 模板是C++类型参数化的多态工具。C++提供函数模板和类模板。
Ø 模板定义以模板说明开始。类属参数必须在模板定义中至少出现一次。
Ø 同一个类属参数可以用于多个模板。
Ø 类属参数可用于函数的参数类型、返回类型和声明函数中的变量。
Ø 模板由编译器根据实际数据类型实例化,生成可执行代码。实例化的函数
模板称为模板函数;实例化的类模板称为模板类。
Ø 函数模板可以用多种方式重载。
Ø 类模板可以在类层次中使用 。