模板

                                                                                       模板

一.模板概述

模板把函数或类要处理的数据类型参数化,表现为参数的多态性。模板用于表达逻辑结构相同,且具体数据元素类型不同的数据对象的通用行为,从而使得程序可以从逻辑功能上抽象,把被处理的对象(数据)类型作为参数传递。

1.函数模板与模板函数

      在声明了一个函数模板后,当编译系统发现有一个对应的函数调用时,将根据实参中的类型来确认是否匹配函数模板中对应的类型形参,然后生成一个重载函数的定义体与函数模板的函数定义体相同,它称之为模板函数。

     函数模板是对一组函数的描述,它不是一个真实的函数,编译系统并不产生任何执行代码。

     函数模板与模板函数的区别:函数模板是一个模板,其中用到通用类型参数,不能直接执行。模板函数是一个具体的函数,它由编译系统在遇到具体函数调用时所生成,具有程序函数的返回值能取任意类型。

     2.类模板与模板类

      类模板允许用户为类定义一种模式,使得类中的某些数据成员、成员函数的参数和成员函数的返回值能取任意类型。

     在声明了一个类模板之后,可以创建类模板的实例,它称之为模板类。

     类模板与模板类的区别:类模板是一个模板,不是一个实实在在的类,其中用到通用类型参数。而模板类是一个类,可以由它定义对象。

二.函数模板

1.声明函数模板

   temple 类型形参表

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

   {

       函数体;

   }  

 2.例子:

  temple  <class  T>

  T  abs (T  x)

  {

   if  (x<0)   return  -x;

   return  x

  }

 3.函数模板的使用

 函数模板是不能直接执行的,需要实例化为模板函数后才能执行。当编译系统发现有一个函数调用:

 函数名(实参表);

C++将根据‘实参表’中的类型生成一个重载函数即模板函数。该模板函数的定义体与函数模板的函数定义体相同,而‘形参表’的类型则以‘实参表’的实际类型为依据。

如以下语句实例化前面声明的函数模板:

 Abs(-10);

由于-10int型,所以实例化为以下真正的模板函数:

int  abs (int  x)

{

  if  (x<0)   return  -x;

   return   x;

}

再以-10为参数调用该模板函数,执行结果是返回10

三.类模板

1.声明类模板

    temple 类型形参表

Class   类名   

   {

       类声明体;

   }

Template   类型形参表

返回类型   类名  类型名表::成员函数1(形参表)

{

   成员函数定义体;

}

    Template   类型形参表

返回类型   类名  类型名表::成员函数2(形参表)

{

   成员函数定义体;

}

................

Template   类型形参表

返回类型   类名  类型名表::成员函数n(形参表)

{

   成员函数定义体;

}

2.例子

     template  <class T>

     Class   TClass1

     {

      T   x,y;

      public:

          TClass1(T  a,T  b)

          {

            x=a;

            y=b;

           }

      T   add()   {return   x+y;}

      Void   disp()

      {

        Cout << x << “+” << y << “=” <<add() << endl;

      }

  };

3.类模板的使用

   同样,类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。

   “类型实参表”应与该类模板中的“类型形参表”相匹配。“对象表”是定义该模板类的一个或多个对象。

 

原文地址:https://www.cnblogs.com/zhangmiao14/p/3764405.html