12.9 章节小结
模板使我们可以用一个代码段指定一组相关函数(称为模板函数)或一组相关类(称为模板类)。
程序员对函数模板的定义只编写一次。基于调用函数时提供的参数类型,C++ 自动产生单独的函数来正确地处理每种类型的调用。这些都是利用程序源代码的剩余空间进行编译。
所有函数模板定义都足用关键字 template 开始的,该关键字之后是用尖括号 <> 括起来的形式参数表。函数模板的每个形式类型参数之前应有关键字class(或新的关键字typename)。关键字 class 指定函数模板的类型参数,实际上表示 任何内部类型或用户自定义类型。
模板定义的形式参数可用来指定传递给函数的参数类型、函数返回类型和声明函数中变量。
形式参数的名字可以只在模板的形式参数表中出现一次。同一个形式参数名可用于多个模板函数。
函数模板本身可以用多种方式重载。我们可以提供其他函数模板,指定不同参数的相同函数名。函数模板也可以用其他非模板函数(同名而不同参数)重载。
类模板提供了描述一个类和实例化类(即该通用类指定类型的版本)的方法。
为了说明如何定制通用类模板以形成指定的模板类,类模板需要类型参数,所以类模板也常常称为参数化类型。
要使用模板类的程序员只需简单地编写一个类模板。在需要用模板建立一个新的指定类型的类时,程序员只需要用一种简洁的表示方法,编译器就会写出该模板类的源代码。
类模板的定义似乎与普通的类定义没什么不同,除了使用 template<class T> 指明这是一个带类型参数 T(指明创建的类的类型)的类模板定义。在类首部和成员函数的定义中,类型作为一个通用的类型名。
在类模板首部以外的成员函数定义都要以 template<class T> 开头。接着,成员函数的定义与普通成员函数的定义相似,只是类中的数据通常用类型参数T表示。二元作用域运算符总是把成员函数的定义与正确的类范围联系起来。
类模板首部也可以使用无类型参数。
特定类型的类可以重定义该类型的类模板。
类模板可以从模板类派生。类模板可以从非模板类派生。模板类可以从类模板派生。非模板类可以从类模板中派生。
函数和整个类都可以声明为非模板类的友元。使用类模板,可以声明各种各样的友元关系。
友元可以在类模板与全局函数间、另一个类(可能是模板类)的成员函数间或整个类中(可能是模板类)建立。
从类模板实例化的每个模板类有自己的类模板的Static数据成员.该模板类的所有对象共享一个static数据成员。和非模板类的static数据成员一样,模板类的Static数据成员也应在文件范围内初始化。
每个模板类有该类模板的 static 数据成员副本。