1. 1、本文档共12页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
09STL

模板和STL 闵卫 minwei@ Day01 为什么需要模板 -E 预处理 g++ -E demo.cpp -S 编译 g++ -S demo.cpp 1)为同一种数据结构或者算法,定义适用于不同类型的版本——代码冗余。 2)借助参数宏摆脱类型的约束,同时也丧失了类型安全——潜在风险。 3)让预处理器自动生成针对不同类型的版本——不易于调试。 4)可以编写带有参数化类型的通用版本,让编译器自动生成针对不同参数类型的具体 版本——模板 函数模板 函数的返回值、参数表和局部变量均可使用类型参数。 templatetypename 类型形参名1,typename 类型形参名2,… 返回类型 函数模板名(形参表){ 函数体 } 使用: 函数模板名类型实参1, 类型实参2,…(实参表); 函数模板的类型参数支持隐式推断。 隐式推断不允许隐式转换,但是可以显式的进行类型转换。 函数返回类型不支持隐式推断 函数模板可以重载 形参不同的同名模板之间,以及函数模板和同名具体函数之间 都可以构成重载关系。 PS:当模板函数与具体函数都可匹配时,优先匹配具体函数。 类模板 类模板:类的成员函数、成员变量和基类都含有可以参数化的类型。 类模板不能隐式推断,只能给出显式类型。 Template typename 类型形参名, typename 类型形参名2, … Class 模板类名 : 继承表{ 成员定义; } 使用: 类模板名类型实参1,类型实参2,…对象名(构造参数表) 【类模板】------实例化-----【类】 -------实例化----- -【对象】 编译期 运行期 类模板的静态成员变量,每个实例类各有一份。 类模板的模板参数可以带有缺省值(从右边缺省开始)。 PS :函数模板的参数不能带有缺省值。 模板的特化 对于某些特定类型而言,通用模板可能并不适用,可以为通用模板提供一种特殊化的定义,作为一般情况之外的特例,为编译器提供一种更为合适的选择。 对于类模板,既可以将整个类模板全部特化,也可以只针对具体类型相关的个别成员函数进行特化。(注意:使用成员特化时,特化版本和通用版本的规格必须完全一致。) PS:当使用模板类型做多文件编程时,需要main.cpp 文件包含 classTemplate.h 文件 classTemplate.h 文件包含 classTemplate.cpp 文件 编译模型 后期编译 模板定义只是一种规范描述,而非真正的类型定义。当编译器看到模板定义时,仅做一般性的语法检查,同时保存一份模板的内部表示,并不生成二进制指令。 当编译器看到模板被实例化为具体函数或类,才真正用模板的内部表示结合类型实参,生成指令代码。 每个C++语言的源文件是单独编译的。因此编译器仅在编译包含模板定义的源文件时保存内部表示。 如果模板的实例化与他的定义不再同一个编译单元中,模板就失去被编译的机会,进而导致链接错误。 包含模型 将模板的声明和定义放在一个头文件中,或者在其头文件中通过#include预编译指令包含定义该模板的源文件。 包含模型的缺陷 暴露了用户不希望或者不了解的实现细节; 模板头文件被多个源文件包含,会延长编译时间。 3. 分离模型 在定义模板的源文件中,加入一个export声明: Comparatro.cpp 当编译器看到某个模板被声明为导出(export)型,会将该模板的内部表示缓存到一个临时文件中。编译器编译到对该模板的实例化代码时,在从这个临时文件中重新读取其内部表示,完成编译和链接。 注意:绝大多数C++编译器都不支持分离模型,而且在新C++11标准中已经删除了分离模型,并将export关键字移做它用。 六. 类模板的局部特化 1. 针对部分类型参数取特定类型进行特化; 编译器优先选择特化程度最高的版本。 针对类型参数之间的某种关联性进行特化; 编译器优先选择匹配程度最高的版本。 针对指针或者数组进行特化; 编译器优先选择针对指针或数组的特化版本。 范例:partial.cpp 注意:当编译器发现同时存在多个匹配程度一样的版本时,会报告歧义错误。 七 . 非类型参数 模板既可以带有类型参数,也可以带有非类型参数,传递给非类型参数的实参只能是常量/常量表达式/常属性(const)的变量,且不能同时具备挥发性(volatile)。 类模板的非类型参数和类型参数一样,也可以带有缺省值。 PS:模板的非类型参数不能是浮点数,也不能是类类型。模板的非类型实参不能是字符串字面值。模板的非类型实参不能是全局指针,模板的非类型实参可以是

文档评论(0)

peain + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档