C++ 模板简介
C++语言引入模板技术,它使用参数化的类型创建相应的函数和类,分别称之为函数模板和类模板
-
- 函数模板:
- 可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计
- 意义:对于功能完全一样,只是参数类型不同的函数,能写一段通用代码是用于多种不同的数据类型,会使代码的可重用性大大提高,从而提高软件的开发效率。
-
- 格式:
-
//将add函数定义成了一个函数模板: template <class T> T add(T x, T y) { return x+y; }
-
- 注意:
- template关键字是表示的是模板
- <>中是模板的参数表,可以有一项或多项,其中类型名称为参数化类型,是一种抽象类型或可变类型。
- class是类型关键字,也可以用typename作为关键字。
- 函数返回值类型可以是普通类型,也可以是模板参数表中指定的类型
- 模板参数表中的参数类型可以普通类型
- 函数模板:
函数模板实例化:
- 显示实例化
-
- 函数名<具体类型名 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]; }