- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第四章模板详解
模板(函数模板、类模板) 模板与类参数 第四章 模板 4.1 模板 参数化程序设计: 通用的代码就必须不受数据类型的限制,可以把数据类型改为一个设计参数。这种类型的程序设计称为参数化(parameterize) 程序设计。 这种设计由模板(template) 完成。包括函数模板(function template)和类模板(class template)。 4.1.1函数模板 函数模板用来创建一个通用函数,支持多种不同类型形参。 函数模板定义: template模板参数表返回类型 函数名(形式参数表) {……;} //函数体 模板参数表(template parameter list)尖括号中不能为空,参数可以有多个,用逗号分开。模板参数主要是模板类型参数。 模板类型参数(template type parameter)代表一种类型,由关键字 class 或 typename(建议用typename ) 后加一个标识符构成,在这里两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。 template typename T void change (T a, T b){ T temp =a; a=b; b=temp; } 与函数一样,函数模板也可以先声明后定义,但声明必须含变量名。 两数交换函数模板: 使用函数模板,只需以函数模板名为函数名进行函数调用: 函数名(数据实参表); 当编译器发现有一个函数模板名为函数名调用时,将根据数据实参表中的对象或变量的类型,确认是否匹配函数模板中对象的数据形参表,然后生成一个函数。该函数的定义体与函数模板的定义体相同,而数据形参表的类型则以数据实参表的类型为依据,该函数成为模板函数。 int a=1,b=2; change(a,b); //整型 float x=3.4, y=5.6; change(x,y); //实型 char m=t ,n=g;change(m,n); //字符型 模板函数 类型和值的置换过程称为模板实例化。 模板函数根据一组实际类型或(和)值构造出独立的函数的过程通常是隐式发生的,称为模板实参推演。 求数组元素中最大值的函数模板。 #include iostream #include string using namespace std; template typename GroapGroap max(const Groap *r_array,int size){ Groap max_val=r_array[0]; for (int i=1;isize; ++i) if(r_array[i]max_val) max_val=r_array[i]; return max_val; } int ia[5]={10,7,14,3,25}; double da[6]={10.2,7.1,14.5,3.2,25.6,16.8}; string sa[5]={上海,北京,沈阳,广州,武汉}; int main() { int i=max(ia,5); cout 整数最大值为:iendl; double d=max(da,6); cout 实数最大值为:dendl; string s=max(sa,5); cout 字典排序最大为:sendl; return 0; } 4.1.2 类模板 类模板定义: template模板参数表 class 类名{ …… //类定义体 }; //分号不可少 template模板参数表 返回类型 类名模板参数名表::成员函数名(形参表) { ……;//成员函数定义体 } 1.类模板的定义格式与类相同,包含说明部分和实 现部分 2.类模板中的成员函数都是函数模板 3.模板参数有两种:模板类型参数和模板非类型参数。 templatetypename T class ADD{ //求和模板类 private : T x; T y; public: ADD(T a,T b); void addshow(); }; templatetypename T ADDT::ADD(T a,T b) { x=a; y=b; } templatetypename Tvoid ADD
文档评论(0)