C++ 之 模板 相关知识点整理

一、什么是模板

模板使得程序(算法)可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递

C++提供两种模板机制:  函数模板     类模板

C++ 之 模板 相关知识点整理

 

二、模板形式/声明

1.声明模板中使用的类属参数,形式为:

template < 类型形式参数表  >

类型形式参数表

                            typename T1 ,  typename T2 , …… , typename Tn      class T1 ,  class T2 , …… , class Tn  

 

2. 函数模板:

2.1函数模板声明

template  < 类型形式参数表 >

类型  函数名 ( 形式参数表 )

    {     语句序列

    }

Ø 函数模板定义由模板说明和函数定义组成

Ø 模板说明的类属参数必须在函数定义中至少出现一次

Ø 函数参数表中可以使用类属类型参数,也可以使用一般类型参数

 

2.2 重载函数模板匹配方案

Ø 寻找和使用最符合函数名和参数类型的函数,若找到则调用它;

Ø 否则,寻找一个函数模板,将其实例化产生一个匹配的模板函数,若找到   则调用它;

Ø 否则,寻找可以通过类型转换进行参数匹配的重载函数,若找到则调用它

Ø 如果按以上步骤均未能找到匹配函数,则调用错误。

Ø 如果调用有多于一个的匹配选择,则调用匹配出现二义性。

 

3.类模板和模板类

3.1类模板声明

template    <类型形式参数表>    
  类声明

template< typename Type >
class TClass
{  // TClass的成员函数
    private :
        Type DateMember ;
    //…
};

 

3.2类模板作为函数参数

Ø函数的形式参数类型可以是类模板或类模板的引用,对应的实际参数是该类模板实例化的模板类对象

Ø 当一个函数拥有类模板参数时,这个函数必定是函数模板

 

3.3类模板要注意知识点

Ø一个类模板在类层次结构中既可以是基类也可以是派生类:

Ø 类模板可以从类模板,或从普通类(非模板类)派生;

Ø 模板类可以从类模板或从普通类派生。

Ø 当一个类模板从普通类派生时,意味着派生类增加了类属参数;

Ø 当一个模板类从类模板派生时,意味着派生类继承基类时提供了实例化的类型参数。

类模板与友元成员

Ø 一个函数或函数模板可以类是或类模板的友元

Ø 一个类或类模板可以是类或类模板的友元类

Ø 声明这种模板之间的友元关系符号比较烦琐

类模板与static成员

Ø从类模板实例化的每个模板类有自己的类模板数据成员,该模板类的所有对象共享一个static数据成员

Ø 和非模板类的static数据成员一样,模板类的static数据成员也应该在文件范围定义和初始化

Ø 每个模板类有自己的类模板的static数据成员副本

 

3.4 模板类

实例化的类模板称为模板类。实例化的函数模板称为模板函数。

 

4.总结

Ø 模板是C++类型参数化的多态工具。C++提供函数模板和类模板。

Ø 模板定义以模板说明开始。类属参数必须在模板定义中至少出现一次。

Ø 同一个类属参数可以用于多个模板。

Ø 类属参数可用于函数的参数类型、返回类型和声明函数中的变量。

Ø 模板由编译器根据实际数据类型实例化,生成可执行代码。实例化的函数

    模板称为模板函数;实例化的类模板称为模板类。

Ø 函数模板可以用多种方式重载。

Ø 类模板可以在类层次中使用 。

 

 

资料参考 《C++程序设计》 周霭如