C++深入了解模板的使用_第1页
C++深入了解模板的使用_第2页
C++深入了解模板的使用_第3页
C++深入了解模板的使用_第4页
C++深入了解模板的使用_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第C++深入了解模板的使用目录一.泛型编程二.函数模板1.函数模板概念2.函数模板格式3.函数模板的原理三.类模板

一.泛型编程

泛型编程:不再是针对某种类型,能适应广泛的类型,跟具体的类型无关的代码

如何实现一个通用的交换函数呢?

voidSwap(intleft,intright)

inttemp=left;

left=right;

right=temp;

voidSwap(doubleleft,doubleright)

doubletemp=left;

left=right;

right=temp;

}

使用函数重载虽然可以实现,但是有一下几个不好的地方:1.重载的函数仅仅是类型不同,代码复用率比较低,只要有新类型出现时,就需要用户自己增加对应的函数2.代码的可维护性比较低,一个出错可能所有的重载均出错

因此我们需要告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码

二.函数模板

模板分为:函数模板,类模板

1.函数模板概念

函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。

2.函数模板格式

templatetypenameT

返回值类型函数名(参数列表){}

说明:

1.templateclassT和templatetypenameT在此暂时认为一样,templatestructT是错误的,没有这种写法

2.T是type的缩写,T不一定写T,可以写任意字母,比如X,t但是习惯写为T

举例:

templatetypenameT//或templateclassT

voidSwap(Tleft,Tright)

Ttmp=left;

left=right;

right=tmp;

intmain()

inta=0,b=1;

doublec=2.2,d=3.3;

swap(a,b);

swap(c,d);

return0;

}

swap(a,b);和swap(c,d);调用的是同一个函数吗?

答:不是同一个。底层汇编可以看出不是同一个,如果调试时发现走的是同一个函数,其实是编译器的优化导致。

实际上以后swap函数都不用自己写了,库中有模板,直接用就行

3.函数模板的原理

在编译器编译阶段,对于模板函数的使用,编译器需要根据传入的实参类型来推演生成对应类型的函数以供调用。比如:当用double类型使用函数模板时,编译器通过对实参类型的推演,将T确定为double类型,然后产生一份专门处理double类型的代码,对于字符类型也是如此。模板的实例化:

三.类模板

类模板的定义格式

templateclassT1,classT2,...,classTn

class类模板名

{

//类内成员定义

};

举例:调用Stackintst1;时,用int替换模板中的T。调用Stackdoublest1;时,用double替换模板中的T

//类模板

templateclassT

classStack

public:

Stack(intcapacity=0)

_a=newT[capacity];

_capacity=capacity;

_top=0;

~Stack()

cout"~Stack()"endl;

delete[]_a;

_capacity=0;

_top=0;

voidPush(constTx)

private:

T*_a;

int_top;

int_capacity;

intmain()

Stackin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论