模板和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:模板的非类型参数不能是浮点数,也不能是类类型。模板的非类型实参不能是字符串字面值。模板的非类型实参不能是全局指针,模板的非类型实参可以是外部变量。
八. 模板的嵌套和递归
您可能关注的文档
最近下载
- 国之脊梁中国科学家的家国天下阅读分享PPT课件.pptx VIP
- 个人简历模板表格简历模板免费下载.docx VIP
- (2026春新版)部编版三年级道德与法治下册全册教案.doc
- 健康体适能评定理论与方法.pptx VIP
- JR DSX7 全中文说明书 和 Spektrum DX7 全中文说明书.docx VIP
- 2020年高级经济师(人力资源)考试真题及参考答案 .pdf VIP
- 社会体育指导专题9 (傅浩坚).ppt VIP
- 2026年山东司法警官职业学院单招综合素质考试模拟试题及答案解析.docx VIP
- 社会体育指导专题8(傅浩坚).pptx VIP
- 肝硬化门静脉高压症食管、胃底静脉曲张破裂出血诊治专家共识(2024版).pptx VIP
原创力文档

文档评论(0)