网站大量收购闲置独家精品文档,联系QQ:2885784924

第9章群体类和群体数据的组织资料.ppt

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

文档评论(0)

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

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

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档