C++程序设计--模版(第6章).pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C/C++程序设计教程 郑秋生 主编 * * 第6章 模板 本章学习重点掌握内容: 函数模板的定义、语法格式及使用 函数模板的实例化 类模板的定义及使用 类模板的实例化 派生类和类模板的关系 * * 第6章 模板 6.1 函数模板 6.2 类模板 * * 6.0 模板的基本概念 (补充) 所谓模板,其实就是一种使用“数据类型”作为参数来产生一系列函数或类的机制。 模板是C++支持多态性的一种工具。 模板将用“类型参数”来完成不同的功能。 * * 这实际上就是一种抽象。 可以将数据类型说明为参数,以适用于其他数据类型,这就是模板。 通过模板可以产生类或函数的集合,它们有能力操作不同的数据类型。 因而也就不必要为每一种数据类型设计一个单独的类或函数。 模板方便了更大规模的软件开发。 减少了程序员编写代码的工作量。 说明了结构相似的类和函数。 * * 6.1 函数模板 【例6.1】函数重载例题 #includeiostream using namespace std; int max(int x, int y) { return xy?x:y ; } char max(char x, char y) { return xy? x:y ; } void main() { int x = 7; int y = 4; coutmax( x, y)endl; double a = 3.5; double b = 4.5; coutmax( a, b)endl; } 学习模板函数之前,首先看看函数重载存在的缺陷。 * * 6.1.1 函数模板语法 函数模板定义的语法格式如下: template class T1, class T2, … 类型名 函数名(参数表) { 函数体的定义 } 其中,template是声明函数模板的关键字。template后一对“”括起来且用“,”分隔的是函数模板参数表。 其中,模板类型形参表的类型可以是任何类型:包含基本数据类型,和类类型。 * * 说明 函数模板是一组函数的描述,不能直接执行,它需要实例化为模板函数后才能执行。 函数模板并不是一个实实在在的函数。 编译系统不会为它产生任何执行代码。 该定义只是对某类函数的描述。 一旦数据类型形参实例化以后,就产生一个实实在在的模板函数。 需要注意的问题 函数模板中的每一个类型参数在函数参数表中必须至少使用一次。 template class T1, class T2 void func1(T1 para1)//错误,没有使用T2 {// 函数体} 函数模板定义中,模板非类型参数是一个普通的参数声明,要求在编译期就确定它的值,实例化时必须是个常量。如下面的size template class T, int size T max(T? (array)[size]) {// 函数体} * * 需要注意的问题-2 和普通的函数一样,对函数模板可以先声明模板,后使用模板,然后在文件的后边或其它文件中给出模板的定义。 当模板函数中包含不适合某一数据类型的操作时,无法实例化,有两种解决方案 针对该数据类重载模板函数中的操作 设计特定函数,这时,在使用特定函数时,将阻止编译器产生函数。 如下列模板无法实现字符串比较: Template class T可以设计特定函数 T max(T x, T y) { return (xy)?x:y; } * * 特定函数: char* max(char* str1,char *str2) { return (strcmp(str1,str2)0)?str1,str2; } 重载操作 string operator (string str1, string str2) { return (pare(str2)0)?str1,str2; } 6.1.2 函数模板实例化 当函数被调用时,由编译器实例化成对应的数据类型的函数。一般编译器在实例化模板时,才检查模板函数的语法正确性。 为了判断用作模板实参的实际类型和值,编译器需要检查函数调用提供的函数实参的类型。用函数实参的类型来决定模板实参的类型和值的过程被称为模板实参推演。 在实例化函数模板时,必须能够通过上下文环境为一个模板实参决定一个唯一的类型或值。如果不能决定出这个唯一的类型或值,就会产生编译时错误。 * * 当编译器遇到表达式max (x, y)时,它就搜索与实参x,y相匹配的实max()。如整型: 编译器将产生一个函数,如下所示。 int max(int x, int y) { return xy?x:y; } 当使用以下实例时,

文档评论(0)

xx88606 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档