第18章 类模板

第18章 类模板

  模板是自动生成新类类型的一种强大机制。标准库的一个重要部分完全建立在定义类模板的功能基础之上.所以理解类模板所涉及的技术就非常重要了。

  本章主要内容
  . 类模板的概念和定义
  . 类模板的实例是什么,如何创建它
  . 如何在类模板定义体的外部,为类模板的成员函数定义模板
  . 类型参数与非类型参数的区别
  . 类模板的静态成员如何初始化
  . 类的部分说明是什么,如何定义它
  . 类模板如何嵌套在另一个类模板中

18.1 理解类模板

  类模板与第 9 章介绍的函数模板类似。类模板是一个参数化类型,也就是使用一个或多个参数创建一系列类的方式,其中对应于每个参数的变元一般是(但并不总是)一个类型.在使用类模板声明变量时,编译器会使用类模板创建类的定义,该定义对应于在声明中使用的模板参数。以这种方式使用类模板,可以生成任意多个不同的类。

  与普通类一样,类模板有一个名称和一组参数。在命名空间中,类模板的名称必须惟一,在声明该模板的命名空间中,不能有其他类或模板与之同名。只要为类模板的每个参数提供一个参数,就可以从类模板中生成类定义。如图18-1所示。

图 18-1 实例化模板

  编译器从类模板中生成的每个类都称为该类模板的一个实例。使用模板类型声明变量会创建该模板的一个实例,也可以显式声明类模板的实例,而不需要在同时声明一个变量。从模板中实例化的类不会重复,因此一旦创建了模板实例,它就可以用于声明该类型的变量。

类模板的应用

  类模板有许多应用,最常见的应用是定义容器类。这些类可以包含以特定方式组织起来的给定类型的对象集。例如,对象数组、叠加堆栈或对象的链表。重要的是所使用的存储方法独立于所存储的对象类型。

  类模板提供的工具可以定义能存储任意类型的对象的容器。模板参数可以用于指定容器要存储的对象类型。标准模板库是标准C++实现的一部分,其中包含的许多模板定义了各种类型的容器。第20章将介绍如何使用它们。

  下面考虑一个可以使用类模板的情形。假定 C++中的数组不能检查用户提供的索引值是否合法,因为这可能会在无意中改写不在数组界限之内的内存位置。当然,一种解决方案是编写自己的 Array 类,检查索引值是否在合法的界限内。这需要为类定义operator[]()函数来检查数组索引值,如果索引值不合法,就抛出异常。

  但这个 Array 类表示什么类型的数组?我们有时需要 double 类型的数组,有时则需要 string 对象的数组,或任何类型的对象数组。这样,就需要为要使用的每种数组类型定义一个类,即使类非常类似,也要定义。编写了这样几个类之后,这些实际上相同的类看起来相
当烦琐,也不必要。而且,每个类还需要使用不同的名称,最后会得到名称为 ArrayOfDouble 、 ArrayOfString、ArrayOfBox 等的类。

  此时使用类模板最合适不过了,因为类模板可以根据所需要的类型生成一个Array类.一旦把 Array 定义为一个类模板,就可以自动创建新的Array类,以管理所需类型的对象。实际上,不必自己定义 Array 模板。标准库已经提供了一个包含上述功能的模板。

posted on 2017-03-05 15:41  一揽芳华  阅读(106)  评论(0编辑  收藏  举报

导航