本篇文章部分参考自互联网有关模板的解释,再经过自己实践及理解而写作出来。感谢互联网资料的帮助。
模板定义:
模板就是实现代码重用机制的一种工具,它可以实现类型参数化,即把类型定义为参数, 从而实现了真正的代码可重用性。模板可以分为两类,一个是函数模板,另外一个是类模板。
模板实现的写作方法:
1.函数模板的写法
函数模板的一般形式如下:
Template <class 或者也可以用typename T>
返回类型 函数名(形参表)
{// 函数定义体 }
{// 函数定义体 }
说明: template 是一个声明模板的关键字,表示声明一个模板关键字class 不能省略,如果类型形参多于一个 ,每个形参前都要加class < 类型 形参表> 可以包含基本数据类型可以包含类类型.
注意:每个模板函数前面都要加上“Template <class 或者也可以用typename T> ”这一行。
//在template语句与函数模板语句之间不允许有别的语句;
请看以下程序:
//mian.cpp
#include <iostream>
// 声明一个函数模版, 用来比较输入的两个相同数据类型的参数的大小,class 也可以被typename 代替,
//T 可以被任何字母或者数字代替。
template <class T>
T max(T &x,T &y)//主要必须是参数引用,不能是 T min(T x,T y)
{
if (a>b)
{
return a;
}
return b;
{
return a;
}
return b;
}
void main( )
{
int i1 = 3,i2=5;
char c1='a',c2='b';
double d1=0.35,d2 = 0.2;
cout<<"for int最大的为:"<<max(i1,i2)<<endl;
cout<<"for char最大的为:"<<max(c1,c2)<<endl;
cout<<"for double最大的为:"<<max(d1,d2)<<endl;
char c1='a',c2='b';
double d1=0.35,d2 = 0.2;
cout<<"for int最大的为:"<<max(i1,i2)<<endl;
cout<<"for char最大的为:"<<max(c1,c2)<<endl;
cout<<"for double最大的为:"<<max(d1,d2)<<endl;
}
2. 类模板的写法
定义一个类模板:
Template < class 或者也可以用typename T >
class 类名{
};
};
说明:其中,template 是声明各模板的关键字,表示声明一个模板,模板参数可以是一个,也可以是多个。 每个前面要有class或typename,用逗号隔开
注意:每个模板类数前面都要加上“Template <class 或者也可以用typename T> “这一行。
例如:定义一个类模板:
// template.h
#paragm once
#paragm once
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){}
void show();
template <typename T1,typename T2>
void myClass<T1,T2>::show()
{
cout<<"I=" <<I<<", J=" <<J<<endl;
}
注意:每个模板类的成员函数前都必须加上模板声明template <typename T1,typename T2> ,然后接下来命名类似于普通类,但必须加上类参数myClass<T1,T2>
// run.cpp
#include "template.h"
#include <iostream>
using namespace std;
void main()
{
//什么一个类的对象类似于普通类对象声明,但必须实例化类模板参数,如:myClass<int ,int > ,其余的调用函数方法跟普通类一样
myClass<int,int>class1(1,2);
class1.show();
class1.show();
myClass<char,char>class2('a','b');
class2.show();
class2.show();
}
3.非类型模版参数
一般来说,非类型模板参数可以是常整数(包括枚举)或者指向外部链接对象的指针。
那么就是说,浮点数是不行的,指向内部链接对象的指针是不行的。
template <typename T, int MAXSIZE>
class Stack{
Private:
T elems[MAXSIZE];
…
};
Int main()
{
Stack<int , 20> int20Stack;
Stack<int , 40> int40Stack;
…
};
注意:最主要是注意格式,特别是类模板 定义的格式 和 实例化类模板的格式 ,函数模板定义时参数用引用& !
转载于:https://blog.51cto.com/pingpeace/229733