Chinaunix首页 | 论坛 | 博客
  • 博客访问: 105069
  • 博文数量: 25
  • 博客积分: 514
  • 博客等级: 下士
  • 技术积分: 690
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-07 01:22
个人简介

漂泊海外的游子

文章分类

全部博文(25)

文章存档

2015年(2)

2013年(1)

2012年(22)

分类: C/C++

2012-02-23 23:40:01

昨天终于说完了类,今天说说模板。顾名思义,就是做模子。以前总搞不清模板和类的区别。都能够生出那么多对象。现在算是明白了,简单的说,模板模的是参数类型,可以生成不同的函数或类;类是本来就是一个自定义的类型。所以模板有函数模板和类模板之分啊。

1. 函数模板
函数模板就是说类型,不管是函数类型,还是参数类型,都是被一般化了,叫做模板参数。当模板变成一个具体的函数时,就可以将具体的类型代替这个一般化类型。这也就是说,同一个函数模板,可以具体化成类型不一样的函数。虽说功能类型,但是你是int型的,我是float型的。

定义
template   function_declaration;
template function_declaration;

两个可以看作是一回事,也就是说classs 和 typename 的作用一样。为什么?以前有人用typename,现在有都用class,但是typename也是有效的。

做个模板函数吧
  1. template <class myType> myType GetMax (myTye a, myType b) {
  2.         return (a>b?a:b);
  3.         }
myType 就是模板参数。

但是具体用的时候要注意,
GetMax (x, y)
看到没有,模板函数声明的时候,函数后面有个尖括号,里面就是这个具体的类型了。当然你也可以换成其他的类型。这样一个具体类型的函数就出来了,你就可以调用它了。

或者,你的输入数据的类型是确定的,也是符合一致的,那就可以直接调用。比如说,你有两个数据:
long a=10, b=8;

GetMax (a, b);

这样也可以。


1.1 模板参数扩展
你可以有一个模板参数,我也可以有两个以上的模板参数,甚至是具体的参数,只要你要需要。用的时候记得类型的一致,也就是接口一致。模板参数不一样,自然你处理的数据的类型也不一样。

2. 类模板
函数能搞模板,类同样也行。就是复杂了些。
说个例子

  1. template <class T> //和函数模板一样
  2. class mypair { //类的声明
  3.    T a, b;
  4.   public:
  5.    mypair (T first, T second) //类模板的构造函数
  6.   {
  7.     a=first; b=second;
  8.    }
  9. T getmax ();

  10. };

  11. template <class T> //类模板中的定义函数
  12. T mypair<T>::getmax () {  //第一个T是getmax的返回类型,第二个是模板参数,类模板中的函数参数,自然也是类模板的模板参数
  13.    T retval;
  14.    retval = a>b?a:b;
  15.    return retval;
  16. }

  17. int main () {

  18. mypair<int> myobject (100, 75);   //变成了一个int型的类,并生成了一个对象,还将其赋值。
  19. cout<<myobject.getmax();
  20. return 0;
  21. }
看到这个没有?
mypair<int> myobject (100, 75);

  先变成了一个int型的类,并生成了一个对象,还将其赋值。一气呵成。不过你要愿意,也可以将模板先特殊化。

template<> class mypair {....};

这样可以了。注意与类模板的不同之处。
templateclass mypair {...};

这其实就和函数模板特殊化一样。就是没有template <> class。

3. 类模板的其他用处
就是在做类模板的时候,模板参数可以是一些具体的参数。例如
template       
class mypair {....};

C++的千变万化,不就是这些东西弄的嘛。

今天就说这了。





阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~