首页 > 学院 > 开发设计 > 正文

模板初探

2019-11-11 07:26:59
字体:
来源:转载
供稿:网友

对于模板这个东西,之前一直知道它的存在,但是也一直是模糊的状态,不清楚它到底是怎么个用法,看别人用的也是模模糊糊的.之前就听闻c++的精髓里面必有的一个就是泛型编程,也就是说的这个模板,今天就初探它的奥妙.

         模板是一种对类型进行参数化的工具;

  通常有两种形式:函数模板和类模板;

  函数模板针对仅参数类型不同的函数;

  类模板针对仅数据成员和成员函数类型不同的类。

  使用模板的目的就是能够让程序员编写与类型无关的代码。比如编写了一个交换两个整型int 类型的swap函数,这个函数就只能实现int 型,对double,字符这些类型无法实现,要实现这些类型的交换就要重新编写另一个swap函数。使用模板的目的就是要让这程序的实现与类型无关,比如一个swap模板函数,即可以实现int 型,又可以实现double型的交换。模板可以应用于函数和类。(引自http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html)

         从上面的介绍可以看出,用模板是可以将一些通用的函数或者类进行再抽象,比如栈,队列等的具体内容用某个名字<(class 形参名>)代替,然后真正要用的时候再将具体内容代入,从而得到正确的效果.这样不仅可以避免很多的重复代码,而且可以处理我们在编写类的时候还不存在的类型.这也是泛型编程的精髓所在吧(我自认为的).

         不过,我此前一直不明白的是,用泛型来写代码,那如果用到的东西那个类没有怎么办?

比如我有个函数是这样的

template<class T>

T sum(T a, T b)

{

         returna+b;

}

那假如我传入的是自定义类型,他没有重载+号,那运行到这里会怎么样呢?

经测试,是编译都编不过的.会得到一个错误(错误     1       errorC2676: 二进制“+”:“B”不定义该运算符或到预定义运算符可接收的类型的转换,B是自定义的类).其实我的一个理解就是这个模板只是编译阶段去处理所有的调用这个模板类或者模板函数的地方,将其换成真正的类型去编译,所以换了之后,如果需要有的函数不存在,则就会出现编译错误.

此外 模板不能跟之前写普通类一样,声明放一个.h文件 实现放.cpp文件.声明和实现必须放在同一个文件里面才能正常工作


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表