模板是实现代码重用的一种方法。化可以实现类型参数化,即把类型定义为参数,从而实现了真正的代码可重用性。对模板的使用可以分函数模板和类模板,关系如下:
模板--->实例化--->{模板函数,模板类}
模板类--->实例化--->模板类对象
对于模板函数,还是比较好理解的,其声明格式如下:
template <class type>或template <typename type>
返回类型 函数名(参数表)
{
函数体
}
例:
template <calss T>
T max(T x,T y)
{
return (x>y)?x:y
}
main()
{
int i=10,j=20;
char c='a',b='k';
cout<<max(i,j)<<endl;
cout<<max(c,b)<<endl;
...
}
注意:
template <class type>或template <typename type>
返回类型 函数名(参数表)
以上格式中template和函数模板定义语句之间不允许插入其它语句。
另在模板函数中允许有多个参数,如template max(class T1,class T2)
函数模板的类型参数只有在该函数真正被调用到时才决定其具体数据类型,编译器将按最先遇到的实参类型生成一个模板函数,并用它对所有模板进行一致性检查。如在上例中如果存在:
int i,char c; max(i,c);则该调用会产生错误,因为编译器将先按变量i将T解释为int 类型,遇到模板实参c不能解释为int类型时则产生错误。
解决办法可以添加一个非模板函数的原型,则系统会首先调用该函数来进行替换。
完整的例子如下:
template <calss T>
T max(T x,T y)
{
return (x>y)?x:y
}
int max(int ,int );
main()
{
int i=10,j=20;
char c='a',b='k';
cout<<max(i,j)<<endl;
cout<<max(c,b)<<endl;
max(i,c);
max(c,i);
...
}
在C++中,函数模板与同名的非模板函数重载时,调用顺序如下:
1、首先寻找一个参数完全匹配的函数并调用该函数
2、其次寻找一个函数模板,将其实例化产生一个匹配的模板函数并调用
3、通过类型转换看是否存在可以匹配的函数或函数模板,存在则调用它
模板类
格式如下:
template <class Type>
class 类名{
......
};
其中:template是声明模板的关键字,表示声明一个模板。Type是模板参数
调用格式:
类名 <实际的数据类型> 对象名
如下例:
template <class T>
class example{
public:
example();
T getexample();
example create();
};
在类定义类外成员函数时,即如果成员函数中存在着模板参数的调用,则需要在函数体外进行模板声明template <class T>,并且在函数名前的类名后缀上<T>,如下例:
template <class T>
example <T>:: example()
{}
template <calss T>
T example <T>::getexample()
{}
example <T> example<T>::create()
{}
另模板类可以有多个模板参数,如上例中可定义为
template <class T1,class T2>
class example{
......
};
另:在学习过程中,也在网上查阅了相关的资料,还有不少书籍描述一个模板方面的知识,并且有些深入让人一时难以理解,不得不再次感叹这些计算机知识的延申真的是无休止的啊,只能是简单了解一下,以待将来再仔细学习了^_^