1.函数模板与类模板的区别
相同点:
- 1.以关键字template开始,后跟一个模板参数列表
- 2.两者定义的类型参数目的相同,都是将数据的类型参数化
不同点:
- 1.函数模板的实例化是由编译程序在处理函数调用时自动完成的;而类模板的实例化必须由程序员在程序中显式地指定。即函数模板允许隐式调用和显式调用,而类模板只能显示调用
2.类模板——模板类(class template——template class)
类模板的重点是模板。表示的是一个模板,专门用于产生类的模子。例子:
template <typename T>
class Vector
{
...
};
使用这个 V e c t o r Vector Vector模板就可以产生很多的 c l a s s class class(类), V e c t o r < i n t > Vector<int> Vector<int>、 V e c t o r < c h a r > Vector<char> Vector<char>、 V e c t o r < V e c t o r < i n t > > Vector< Vector<int> > Vector<Vector<int>>、 V e c t o r < S h a p e ∗ > … … Vector<Shape*>…… Vector<Shape∗>……。
模板类的重点是类。表示的是由一个模板生成而来的类。例子:
上面的 V e c t o r < i n t > 、 V e c t o r < c h a r > 、 … … Vector<int>、Vector<char>、…… Vector<int>、Vector<char>、……全是模板类。
3.函数模板——模板函数(function template——template function)
函数模板的重点是模板。表示的是一个模板,专门用来生产函数。例子:
template <typename T>
void fun(T a)
{
...
}
在运用的时候,可以显式( e x p l i c i t l y explicitly explicitly)生产模板函数, f u n < i n t > 、 f u n < d o u b l e > 、 f u n < S h a p e ∗ > … … fun<int>、fun<double>、fun<Shape*>…… fun<int>、fun<double>、fun<Shape∗>……。
也可以在使用的过程中由编译器进行模板参数推导,帮你隐式( i m p l i c i t l y implicitly implicitly)生成。
fun(6);//隐式生成fun<int>
fun(8.9);//隐式生成fun<double>
fun(‘a’);// 隐式生成fun<char>
Shape* ps = new Cirlcle;
fun(ps);//隐式生成fun<Shape*>
模板函数的重点是函数。表示的是由一个模板生成而来的函数。例子:
上面显式( e x p l i c i t l y explicitly explicitly)或者隐式( i m p l i c i t l y implicitly implicitly)生成的 f u n < i n t > 、 f u n < S h a p e ∗ > … … fun<int>、fun<Shape*>…… fun<int>、fun<Shape∗>……都是模板函数。