模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。
分两类,一个函数模板,一个是类模板
模板的概念
我们已学习过重载(overloading),对重载函数而言,c++的检查机制能通过函数参数的不同及所属类的不同。正确的调用重载函
数。
例如为求两个数的最大值,我们定义MAX()函数需要对不同的数据类型分别定义不同重载(overloading)版本。
//example1
int max(int x,int y)
{
return (x>y)?x:y;
}
//example1
float max(float x,float y)
{
return (x>y)?x:y;
}
//example1
double max(double x,double y)
{
return (x>y)?x:y;
}
但如果在主函数中,我们分别定义了char a,b;那么执行max(a,b)时,程序就会出错,因为我们没有定义char
类型的重载版本。
函数模板的写法
函数模板的一般形式如下
Template <class 或者 typename T>
返回类型 函数名(形参表)
{//函数定义体}
template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,
如果类型形参多余一个,每个形参前都要家class<类型 形参表>可以包含基本数据类型可以包含类型。
/********************************************************/
#include<iostream.h>
//声明一个函数模板,用来比较输入的两个相同数据类型的参数的大小,class也可以被typename代替
//T可以被任何字母或者数字代替
template <class T>
T min(T x,T y)
{
return(x<y)?x:y;
}
int main(void)
{
int n1=2,n2=10;
double d1=1.5,d2=2.5;
cout<<"较小整数:"<<min(n1,n2)<<endl;
cout<<"较小实数:"<<min(d1,d2)<<endl;
return 0;
}
/********************************************************/
#ifndef __1_H__
#define __1_H__
#include <iostream.h>
template<typename T1,typename T2>
class myClass
{
private:
T1 I;
T2 J;
public:
myClass(T1 a,T2 b);
void show();
};
template<typename T1,typename T2>
myClass<T1,T2>::myClass(T1 a,T2 b):I(a),J(b)
{
}
template<typename T1,typename T2>
void myClass<T1,T2>::show()
{
cout<<"I="<<I<<",J="<<J<<endl;
}
#endif
#include "1.h"
int main(void)
{
myClass<int,int> class1(3,5);
class1.show();
myClass<int,char> class2(3,'a');
class2.show();
myClass<double,int> class3(2.9,10);
class3.show();
return 0;
}
/********************************************************/
文章评论(0条评论)
登录后参与讨论