- 1、本文档共12页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)