C++ 模板简介

 

   C++语言引入模板技术,它使用参数化的类型创建相应的函数和类,分别称之为函数模板类模板

    • 函数模板:
      • 可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计
      • 意义:对于功能完全一样,只是参数类型不同的函数,能写一段通用代码是用于多种不同的数据类型,会使代码的可重用性大大提高,从而提高软件的开发效率。
      • 格式:      
      • //将add函数定义成了一个函数模板:  
         template <class T> 
        T add(T x, T y)
        {
           return x+y;
         } 

         

      •  

      • 注意:

         

        1.   template关键字是表示的是模板
        2.        <>中是模板的参数表,可以有一项或多项,其中类型名称为参数化类型,是一种抽象类型或可变类型。
        3.         class是类型关键字,也可以用typename作为关键字。
        4.         函数返回值类型可以是普通类型,也可以是模板参数表中指定的类型
        5.        模板参数表中的参数类型可以普通类型

          函数模板实例化

  1. 显示实例化
    •   函数名<具体类型名 1,具体类型名 2,.......,常量表达式>(实参表)

     

    • 根据< >中给出的具体类型,用类似于函数调用实参于参数结合的方式,将模板参数表中的参数化类型一一实例化称具体的类型,函数中的参数化类型也一一实例化。
    • 如果模板参数表中有形式参数,还需要用常量表达式去初始化

  例如:

     使用add<double>(8,9)将 T add(T x, T y)实例化成:

        double add(double ,double)

     使用sum< int ,100>将T sum()实例化成:

        int sum(size),size获得初值100.

  2.隐式实例化:

    隐式实例化的格式为函数调用,实例化过程是在实参与形参结合时,用实参的类型实例化形参对应的参数化类型

 

  例如:

      使用add(‘A’,‘B’)将 T add(T x,T y)实例化成:

          char add(char,char)

  注意 : 

      使用隐式实例化无法初始化模板参数表中的普通类型的形参,如果模板参数表中使用普通类型参数,必须使用显示初始化

  

#include<iostream>
using namespace std;
template <class T1,class T2> //函数模板定义
T1 add(T1 x, T2 y)
{ 
      cout<<"("<<sizeof(T1)<<","<<sizeof(T2)<<")\t";
      return x+y; 
}
void main()
{ 
   cout<<add(9,8)<<endl;//函数模板调用
   cout<<add(9.0,8.0)<<endl;
   cout<<add(9,8.0)<<endl;
   cout<<add(9.0,8)<<endl;
   cout<<add('A','A'-'0')<<endl;
   cout<<add(long double(8),9)<<endl;

 

 

  类模板

  •  1. 模板参数表中的类型为参数化(parameterized)类型,也称可变类型,类型名为class(或typename);模板参数表中的类型也可包含普通类型,普通类型的参数为类的成员提供初值。
  •  2.   类模板中的成员函数也可以是函数模板,也可以是普通函数

格式:                 

 3 {
 4   private:
 5       TNO StudentID[num];      //参数化类型数组,存储姓名
 6       TScore score[num];      //参数化类型数组,存储分数
 7   public:
 8       TNO TopStudent()     //普通函数
 9       {  
10               return StudentID[0];
11       }
12   int BelowNum(TScore  ascore)  //函数模板
13       {
14               return 0;
15       }
16       void sort()                  //普通函数
17       {
18 } 19 20 }

    模板类的成员函数也可以在类外定义

      • 模板参数表与类模板的模板参数表相同
      • 模板参数名表列出的模板参数表中参数名,顺序与模板参数表中的顺序一致。 

格式:

template <class TNO, class TScore, int num> 
class Student                      
{
  private:
      TNO StudentID[num];
               TScore score[num];
  public:
      TNO TopStudent();  
      int BelowNum(TScore ascore); 
      void sort();
};
template <class TNO, class TScore, int num> 
int Student<TNO, TScore, num>::BelowNum(TScore ascore)
{
   return 0;
}
template <class TNO, class TScore, int num> 
void Student<TNO, TScore, num>::sort()
{
}
template <class TNO, class TScore, int num> 
TNO Student<TNO, TScore, num>::TopStudent()
{
         return StudentID[0];
}

 

  

        

    

posted @ 2019-12-27 17:00  土豆吖  阅读(302)  评论(0编辑  收藏  举报