首先看一个例子:

wKiom1bya0-QrTSYAAAjTtqh81A714.png

    我们发现在比较a,b是否相等时,因它们的类型不确定,必须得写出多个函数。而这些函数出了参数的类型以及返回值类型不同外,其他都相同。这样使程序看起来繁琐,是否有方法完成既可以使程序简洁而且还能以上不同类型比较功能呢?当然有呀。那就是模板。

    所谓模板,就相当于公式一样。模板编程也叫泛型编程。可以处理在编写程序时类型不知道的情况,在编译时就能获取类型。

所以:

   以上程序可以用下面的函数模板代替:

   wKiom1bybD_hSKPiAAAVi7cFf4w962.png

调用时:

  wKioL1bybTDjXZVoAAAaUj47GEA426.png


2. 模板分为函数模板和模板类。

  (1)函数模板

   格式:template <typename T1,typename T2,...>

      返回类型 函数名(参数列表)

          {函数体}

   wKiom1byYp7B_YXFAAAOlxL0RTw600.png

   调用时:

         equal(1,2);

   

  wKioL1byZN7DZ8woAAAQCs3k_2A311.png

         T1,T2类型不同时,

    调用时:

         equal(1,(int)2.3);

         equal<int>(2,2.5);//显示实例化


    (2)模板类

     格式:template <typename T1,typename T2,...>

           class 类名{};

     wKiom1byY96TVs6DAAAOgfG3gKc708.png

3.模板编译

  当编译器遇到一个模板的定义时,不会为其生成代码,而是在我们实例化模板的一个特例时,编译器才会生成代码。

  通常,当我们调用一个普通函数时,只要知道掌握了函数的声明。在定义一个类类型的对象时,我们可以将类定义和普通函数声明放在头文件,而将函数的定义以及类的成员函数的定义放在类外。但是模板不同,为了生成一个实例化的对象,编译器需要知道函数模板和类模板的成员函数的定义,所以应将类的定义,类成员函数的定义,普通函数的声明,定义都应放在头文件中。