C++的一个重要的特性之一就是代码重用,为了实现代码重用,代码必须具有通用性,通用代码应不受数据类型的影响,并且可以自动适应数据类型的变化。这种程序设计类型称为参数化程序设计。模板C++支持参数化程序设计的工具,通过它可以实现参数化多态性。参数化多态性,就是将程序所处理的对象的类型参数化,通过参数传递的形式,将一个函数传递给另一个函数的参数,使得一段程序可以处理多种不同类型的对象。
函数模板的定义形式:
template<模板参数表> //模板参数表适用逗号分隔的模板参数构成,包括class标示符、“类型说明符”标示符、template<参数表>class标示符。
类型名 函数名(参数表)
{
函数体的定义
}
#include "stdafx.h"
#include<iostream>
using namespace std;
template<typename T> //定义函数模板
T abs(T x) //定义函数模板函数,通过它的参数,我们可以得到该函数的类型和它返回值的类型。
{
return x<0 ? -x : x;
}
int main()
{
int n = -5;
double d = -5.5;
cout << abs(n) << endl; //实例化函数模板,该函数模板函数类型为int.
cout << abs(d) << endl;
getchar();
return 0;
}
本程序是清华大学C++语言程序设计9_1的实例。经过调试正确。
#include "stdafx.h"
#include<iostream>
using namespace std;
template<class T> //定义函数模板
void outputArray(const T*array, int count) //定义输出函数模板函数,第一个参数为T类型指针即函数模板指针为数组指针,类型为常量,Only output not change。
{
for (int i=0; i < count; i++)
{
cout << array[i] << " ";
cout << endl;
}
}
int main()
{
const int A_COUNT = 8, B_COUNT = 8, C_COUNT = 20;
int a[A_COUNT] = { 1, 2, 3, 4, 5, 6, 7 };
double b[B_COUNT] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8 };
char c[C_COUNT] = "Welcome to see you!";
cout << "a array contains:"<< endl;
outputArray(a, A_COUNT); //调用输出函数模板函数,通过其两个实参的传递,实现函数的重载。体现了C++的多样性。
cout << "b array contains:" << endl;
outputArray(b, B_COUNT); //同上。
cout << "c array contains:" << endl;
outputArray(c, C_COUNT);
getchar();
return 0;
}
如果有错误,欢迎大家指出。
注意:虽然函数模板的使用形式和函数类似,但是二者有本质的不同,主要表现在以下三个方面
1、 函数模板本身在编译时不会产生任何目标代码,只有由模板生成的实例会生成目标代码。就像它是灵魂,但是没有肉体一样。
2、 当函数模板被多个源文件引用时,应当连同函数体一同放在头文件中,而不能像普通函数那样只将声明放在.h文件中。
3、 函数指针也只能指向模板的实例,而不能指向模板本身。