- 1、本文档共100页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* ******************2013/12/17 * * * * * * * * * * * * * * * * * * * * * 函数模板 vs 函数 函数模板本身不是函数 编译器不会为函数模板本身生成目标代码 只有函数模板的实例能被调用 例:考虑下列模板template class Tvoid outputArray(const T *array, int count); 若a是int数组,outputArray(a, 10)等价于outputArrayint(a, 10),被调用的是outputArray实例 * 9.5 深度探索 —— 9.5.1 模板的实例化机制 隐含实例化 模板的实例化 根据函数模板生成具体的函数、或根据类模板生成具体的类的过程 隐含实例化 编译器会自动按需对模板实例化 所有会被使用的模板实例会被生成 对类模板的隐含实例化并不意味着对它成员函数的定义也进行实例化,当类模板成员函数会被使用时,才会被实例化 * 9.5 深度探索 —— 9.5.1 模板的实例化机制 多文件结构中模板的组织 模板实例化机制带来的新问题 不能把下面与模板相关的定义放在源文件中 函数模板的定义 类模板成员函数 类模板静态数据成员 解决方法 把与模板相关的定义放在头文件中——最通常的解决办法 编译器有特殊处理,保证不会有连接冲突 使用export关键字——编译器支持不好 使用模板的显式实例化机制 * 9.5 深度探索 —— 9.5.1 模板的实例化机制 显式实例化 语法形式 template 实例化目标的声明; 作用 一个模板实例无论是否在本编译单元中被使用,都会被生成 例 template void outputArray(const int *array, int count); template class Storedouble; 在多文件结构中的用途 使用在程序中可能会被用到的各种参数对模板显式实例化,使得与模板相关的定义可以放在源文件中 * 9.5 深度探索 —— 9.5.1 模板的实例化机制 9.5.2 为模板定义特殊的实现 为什么要定义特殊的实现? 模板抓住了算法与数据结构上的共性,但忽略了类型的个性 设计出的模板对于具体的数据类型而言未必具有最好的效率 例:Stack类模板 如果以bool作为类型参数,则有7/8的空间浪费 Stackbool,32中的list数组占32个字节,实际上4个字节就够 * 9.5 深度探索 模板的特化 什么是特化 为一个模板在特定参数下提供特殊定义 既适用于类模板,又适用于函数模板 对Stackbool, 32特化的类定义 template class Stackbool, 32 { private: unsigned list; int top; public: Stack(); void push(bool item); bool pop(); void clear(); bool peek() const; bool isEmpty() const; bool isFull() const; }; * 9.5 深度探索 —— 9.5.2 为模板定义特殊的实现 * 模板的特化 (续) //特化类的部分成员函数定义 void Stackbool, 32::push(bool item) { assert(!isFull()); ++top; list = (list 1) | (item ? 1 : 0); } bool Stackbool, 32::pop() { assert(!isEmpty()); bool result = ((list 1) == 1); list = 1; --top; return result; } 9.5 深度探索 —— 9.5.2 为模板定义特殊的实现 类模板的偏特化 对Stackbool,32特化的问题 适用范围过窄,SIZE必须是32 类模板的偏特化 将一部分参数固定,而使另一部分参数可变,设计特殊的定义 只适用于类模板 对Stack偏特化的类定义 template int SIZE class Stackbool, SIZE { private: enum { UNIT_BITS = sizeof(unsigned) * 8, ARRAY_SIZE = (SIZE - 1) / UNIT_BITS + 1 }; unsigned list[ARRAY_SIZE]; int top; public: Stack(); void push(bool item); bool pop(); void clear(); bool peek() co
您可能关注的文档
- 超滤培训SFP讲义讲义.ppt
- 阳极组装车间设备安装施工方案讲义.doc
- 超全的企业所得税账务处理总结讲义.doc
- 通信业基础名词讲义.doc
- 超声波萃取和加速溶剂萃取讲义.ppt
- 通信原理(第6版)复习提纲讲义.doc
- 通信原理(樊昌信第六版)第3章讲义.ppt
- 通信原理(樊昌信第六版)第10章讲义.ppt
- 第五版_统计学_导论概要.ppt
- 超声波清洗机的系统设计(PLC)讲义.doc
- 吉安县公开招聘专职文明实践员笔试备考试题及答案解析.docx
- 2025重庆枫叶国际学校招聘教师笔试备考试题及答案解析.docx
- 游机队电玩自制联网教程-tplink.pdf
- 2025重庆新华出版集团招聘1人笔试模拟试题及答案解析.docx
- 2025宜宾高新丽雅城市产业发展有限公司公开招聘笔试模拟试题及答案解析.docx
- 2025云南保山市龙陵县勐糯镇人民政府招聘合同制专职消防员1人笔试模拟试题及答案解析.docx
- 11.1生活中常见的盐 九年级化学人教版下册.pptx
- 6.1法律保护下的婚姻 高二政治《法律与生活》课件(统编版选择性必修2)(新版).pptx
- 文昌市中小学教师校园招聘29人笔试模拟试题及答案解析.docx
- 10.1.5 常见的酸和碱(第5课时)课件-九年级化学人教版下册.pptx
文档评论(0)