一. 模板的概念
~~~~~~ 模板是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可复用性。
二. 函数模板与模板函数
~~~~~~ 函数模板就是建立一个通用函数,其函数返回类型和形参类型不具体指定,用一个虚拟的类型来代表。在调用函数时,系统会根据实参的类型(模板实参)来取代模板中虚拟类型从而实现了不同函数的功能。声明格式如下:
template <typename 类型参数>
返回类型 函数名 (模板形参表)
{
函数体
}
也可以定义为如下形式:
template <class 类型参数>
返回类型 函数名 (模板形参表)
{
函数体
}
其中,template是一个声明模板的关键字,它表示声明一个模板。类型参数实际上是一个虚拟的类型名,并未指定为具体的类型,但是在使用函数模板时,必须将类型参数实例化。类型参数前需要加关键字 typename 或 class,两者的作用相同,都表示其后的参数是一个虚拟的类型名(即类型参数)。
【例一】
#include<iostream>
using namespace std;
template<typename T>
T max(T *p, T n)
{
int j = 0;
for(int i = 0; i < n; i ++)
{
if(p[i] > p[j])
j = i;
}
return p[j];
}
int main()
{
int int_array[] = {11, 22, 33, 44, 55, 66, 77, 88, 99, 1010};
double double_array[] = {11.1, 22.2, 33.3, 44.4, 55.5, 66.6, 77.7, 88.8, 99.9, 100.10};
cout << "The int_max is " << max(int_array, 10) << endl;
cout << "The double_max is " << max(double_array, 10.0) << endl;
return 0;
}
输出结果为:
The int_max is 1010
The double_max is 100.1
【例二】
#include<iostream>
using namespace std;
template <typename T1, typename T2>
void myprint(T1 x, T2 y)
{
cout << x << " " << y << endl;
}
int main()
{
myprint(99, "zhang");
myprint(123.45, 888);
return 0;
}
输出结果为:
99 zhang
123.45 888
三. 类模板与模板类
~~~~~~
所谓类模板,实际上建立一个通用类,其数据成员,成员函数的返回类型和形参类型不具体指定,用一个虚拟的类型来代表。使用类模板定义对象是,系统会根据实参的类型来取代模板中虚拟类型从而实现了不同类的功能。
定义格式如下:
template <typename 类型参数>
class 类名{
类成员声明
};
也可以定义为如下格式:
template <class 类型参数>
class 类名{
类成员声明
};
~~~~~~ 在类声明中,欲采用通用数据类型的数据成员,成员函数的参数或返回类型前面需加上类型参数。用类模板定义对象时,采用以下形式:
类模板名 <实际类型名>对象名[(实际参数列表)];
【例三】
#include<iostream>
using namespace std;
template<class T>
class A
{
private:
T a;
T b;
T c;
public:
A(T a_, T b_, T c_)
{
a = a_;
b = b_;
c = c_;
}
T sum()
{
return a + b + c;
}
};
int main()
{
A <int>obj1(3, 5, 7);
cout << "The three_int sum is " << obj1.sum() << endl;
A <double>obj2(12.34, 34.56, 56.78);
cout << "The three_double sum is " << obj2.sum() << endl;
return 0;
}
输出结果为:
the three_int sum is 15
the three_double sum is 103.68
~~~~~~ 成员函数可以定义在类体内,也可以定义在类模板外,c++此时有一些特殊的规定:
- 需要在成员函数定义之前进行模板声明
- 在成员函数名前缀上"类名<类型参数>"
在类模板体外定义的成员函数的一般形式如下:
template <typename 类型参数>
函数类型 类名<类型参数>::成员函数名(形参表)
{
...
}
将例三的函数体定义在类外:
【例四】
#include<iostream>
using namespace std;
template<class T>
class A
{
private:
T a;
T b;
T c;
public:
A(T a_, T b_, T c_);
T sum();
};
template <typename T>
A<T>::A(T a_, T b_, T c_)
{
a = a_;
b = b_;
c = c_;
}
template <typename T>
T A<T>::sum()
{
return a + b + c;
}
int main()
{
A <int>obj1(3, 5, 7);
cout << "The three_int sum is " << obj1.sum() << endl;
A <double>obj2(12.34, 34.56, 56.78);
cout << "The three_double sum is " << obj2.sum() << endl;
return 0;
}