[计算机]C++实用教程[郑阿奇主编]15.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[计算机]C实用教程[郑阿奇主编]15

第15章 模 板 15.1 函数模板 15.1.1 函数模板定义 函数模板的定义包括两部分:一是模板(类型参数)声明部分,二是函数自身声明或定义部分。其中: (1)template是C++关键字,表示声明的是模板。 (2)由一对“ ”尖括号构成的是该模板的类型参数表,其中可以有一个或多个类型参数,但多个类型参数之间需用逗号“,”分隔。 (3)每个类型参数可以由C++关键字class和类型名组成,或由一般具体类型和类型名组成,其中类型名一定要符合C++命名规则。 说明 (1)在类型参数声明中,由于class是类声明关键字,为了避免混淆,在ANSI/ISO C++中,往往将class关键字用typename关键字代替 (2)函数模板的定义可像函数那样将声明和实现两部分分别进行 (3)对于在模板声明部分声明的类型名来说,若模板声明部分是在函数模板原型声明前 面,则类型名的作用域仅在函数模板原型范围内;若模板声明部分是在函数模板定义或实现前面,则类型名的作用域是该函数的作用域范围 15.1.2 函数模板实例化 函数模板的实例化分为隐式实例化和显式实例化 1. 隐式实例化 #include iostream using namespace std; template class T1, class T2 // 定义函数模板 T1 sum(T1 x, T2 y) { return x+y; } int main() { coutsum(2,a)endl; // 结果为99 coutsum(a,2)endl; // 结果为c coutsum(2.2, 5.5)endl; // 结果为7.7 coutsum(2, 5.5)endl; // 结果为7 return 0; } 程序运行结果如下: 2. 显式实例化 [例Ex_FTExplicit] 函数模板的显式实例化 #include iostream using namespace std; template class T1, class T2, int ZZZ // 定义函数模板 T1 sum(T1 x, T2 y) { return x+y+ZZZ; } int main() { coutsumint, char, 3(2,a)endl; // 结果为102 coutsumdouble,double, 5(2, 5.5)endl; // 结果为12.5 return 0; } 程序运行结果如下: 15.1.3 函数模板具体化 函数模板实例化的目的是指定实际调用时的实际类型及给带有数据的参数指定初值,但对于有些实参,如带有new连续内存空间的类对象,则会因为内存空间的不良操作而导致实例化函数调用终止 对于这种类型(CName)的myswap模板函数操作应重写其具体化代码,称为函数模板的具体化(Specialization)。 15.1.4 函数模板重载 函数模板重载能允许多个同名的函数模板存在,但同名的各个函数模板的模板声明部分的形参和函数头中的形参必须有区别:要么形参的个数不同,要么形参的个数相同但参数的通用类型名不同 要注意函数模板重载后,其实例化不能出现“二义性” 当同名普通函数和同名函数模板同时出现在代码中时,要注意调用的优先级 [例Ex_TSwap] 函数模板的重载示例。 #include iostream #include cstring using namespace std; class CName { char *name; // 姓名 public: CName( char* str = NULL ) { if (str) { name = new char[strlen(str)+1]; strcpy(name, str); } } ~CName() { if (name) { delete []name; name = NULL; } } void SetName(char* str) { if (name) { delete []name; name = NULL; } if (str) { name = new char[strlen(str)+1]; strcpy(name, str); } } char* GetName(void) { return name; } }; template class T, int ID //

文档评论(0)

ipbohn97 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档