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

第七课 模板及标准库.ppt

  1. 1、本文档共33页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第七课 模板与标准库 函数模板 类模板 标准库 为什么要有模板? 为什么要有模板? 例子: qsort 算法完全一样,但你可能需要给不同的数据类型写几乎完全相同的代码。 qsort(int a[], int N), qsort(double a[], int N) 有了模板机制,C++能支持泛型编程 基本原理 通过待定的类型参数(或非类型参数)编写代码,在实际使用时,才实例化它。 函数模板 基本语法: templatetypename T//这里的T称为类型参数 void qsort(T a[], int N) { //…. } 使用 int ia[100]; qsort(ia, 100); double da[23]; qsort(da, 23); 编译器会推导类型参数,当推导不出来时,需要用户指定 定义函数模板: 函数模板用法: 以函数模板名作调用的函数名,以数据实参作参数传递 调用时指定模板参数 例子 模板的完全特化和部分特化 templateclass T T sqrt(T); templateclass T complexT sqrt(complexT); //部分特化 template int sqrtint(int); //完全特化 double sqrt(double); //普通函数 函数模板重载与解析 可以声明多个具体同样名字的函数模板,甚至可以声明具体同一个名字的多个函数模板和常规函数的组合。当函数被调用时,调用的是哪一个呢? 函数模板重载与解析 找出能参与这个重载解析的一组函数模板的专门化。做这件事的方式就是查看每一个函数模板,确定对它是否存在一组可以使用的模板参数,如果存在的话,究竟是哪一组参数。 如果两个模板函数都可以调用,而其中的一个比另一个更专门化,则随后的步骤就只考虑那个最专门的模板函数。 在这组函数上做重载解析,包括那些常规函数,如果某个模板函数参数已经通过模板参数推断确定下来,这个参数就不能同时应用提升、标准转换或用户自定义的转换。 如果一个常规函数和一个专门化(模板函数)具有同样好的匹配,那么则选用常规函数 如果找不到匹配,就是一个错误,如果找到多个同样好的匹配,也是一个错误 类模板 有些类,比如容器类,处理一种类型的对象与处理另一种类型的对象方法一样,但是就因为处理的对象类型不同,而使该类必须重新定义. 例如:矩阵,整型矩阵类和浮点型矩阵类 通过模板类定义,可以解决代码冗繁问题: templatetypename T class Node{ public: Node(const T d):c(d),next(0),pref(0){} T c; Node *next, *pref; }; 使用类模板 void f() { Nodeint ni(3); Nodedouble nd(4.4); typedef Nodechar NC; NC nc(‘a’); } 类模板的使用将直接透入对象的构造,因此,允许类模板带有值参便理所当然了. templateunsigned int N class bitset; 但是类型值参将导致不同的类模板描述,因而决定了不同的值参值,生成不同的模板类 bitset100 a; bitset200 b; a = b; // error 值参值应为编译能识别的常量,值参必须为整型. 例子 程序组织 包含方式 模板使用的方式,不但创建了模板函数定义或模板类定义,还实施了函数调用,或者创建了对象,实施了对象操作.因此,除了需要函数模板声明或类模板定义之外,还需要函数模板定义和类模板的实现.也就是说,任何使用模板之前,编译应该能够事先看到整个模板的说明.这就是包含方式的由来. 即,使用模板的地方需要看到模板的实现,要include该实现文件 这种方式不符合原有的分离式的编译方案 模板使用 //x.cpp #include”tlist.h” int main(){ Listdouble dList; dList.add(3.6); dList.print(); Listint iList; iList.add(5); iList.add(8); iList.print(); } 程序组织 分离方式 通过关键字export来规定编译和链接模板的方式,分离模板定义和模板实现,让使用模板者无须与模板实现见面.目前还很少有编译器支持这种分离编译模式 显示实例声明 template class vectorint; template absint(int ); 在显示实例化类模板时,它的所有成员也被实例化,如果有成员未定义,则会编译出错 C++标准库 标准库的所有组件都声明在名

您可能关注的文档

文档评论(0)

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

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

1亿VIP精品文档

相关文档