您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 第4专题 用模板进行编程
第四专题用模板进行编程重庆大学计算机学院葛亮Email:geliang@cqu.edu.cn2008年4月学习目标能够使用和设计模板理解模板在程序设计中所起的作用内容目录模板概述函数模板与模板函数类模板与模板类模板参数模板应用技巧重点内容函数模板、类模板的设计模板参数模板应用技巧学习方法以函数模板为出发点,学习类模板抓住模板的本质意义,理解模板的用途和用法模板概述最初模板被称为“被参数化的类型”(parameterizedtypes),类型信息可以从模板定义式中抽离出来。模板扮演了“处方笺”的角色,能够根据用户指定的特定类型或者特定值,自动产生一个函数或类。核心思想:将数据类型参数化。目的:快速建立具有类型安全的类库集合和函数集合,方便更大规模的软件开发。模板分为函数模板和类模板两大类。函数模板定义形式:templatetypenameelemType1,typenameelemType2,…,typenameelemTypeN返回类型functionName(形式参数表){//函数定义体}调用:functionName(实参列表);这样的函数模板定义只是一个框架。当编译器发现一个函数调用,将根据实参列表中的类型确认是否匹配函数模板中对应的形参列表,然后生成一个重载函数,即模板函数。#includeiostreamusingnamespacestd;templatetypenameelemTypeelemTypemax(elemTypea,elemTypeb){return(ab?a:b);}voidmain(){coutMax(3,5)ismax(3,5)endl;coutMax('3','5')ismax('3','5')endl;}intmax(inta,intb){return(ab?a:b);}charmax(chara,charb){return(ab?a:b);}函数模板可以替代某些情况下的函数重载intadd(int,int);longadd(long,long);doubleadd(double,double);templatetypenameelemTypeelemTypeadd(elemTypea,elemTypeb){//函数定义体}函数模板求绝对值函数的模板#includeiostreamusingnamespacestd;templatetypenameTTabs(Tx){returnx0?-x:x;}intmain(){intn=-5;doubled=-5.5;coutabs(n)endl;coutabs(d)endl;}函数模板运行结果:55.5重载模板函数#includeiostreamusingnamespacestd;templatetypenameelemTypeelemTypemax(elemTypea,elemTypeb){return(ab?a:b);}char*max(char*a,char*b){return(strcmp(a,b)0?a:b);}voidmain(){coutMax(\Hello\,\Gold\)ismax(Hello,Gold)endl;}编译器首先匹配重载函数,然后再寻求模板的匹配函数模板类模板的作用使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。类模板类模板的声明定义形式:template模板参数表class类名{//类的定义};template模板参数表返回类型类名参数名表::成员函数名(形参表){//成员函数体}使用:类模板类型实参数表对象名1,…,对象名n;类模板例9-2类模板应用举例#includeiostream#includecstdlibusingnamespacestd;//结构体StudentstructStudent{intid;//学号floatgpa;//平均分};类模板templatetypenameT//类模板:实现对任意类型数据进行存取classStore{private:Titem;//用于存放任意类型的数据inthaveValue;//用于标记item是否已被存入内容public:Store(void);//默认形式(无形参)的构造函数TgetElem(void);//提取数据函数voidputElem(Tx);//存入数据函数};//默认形式构造函数的实现templatetypenameTStoreT::Store(void):haveValue(0){}templatetypenameT//提取数据函数的实现TStoreT::getElem(void){//如果试图提取未初始化的数据,则终止程序if(haveValue==0){coutNoitempresent!endl;exit(1);}returnitem;//返回item中存放的数据}templatetypenameT//存入数据函数的实现voidStoreT::putElem(Tx){//将haveValue置为TRUE,表示item中已存入数值haveValue++;item=x;//将x值存入item}intmain(){Studentg={1000,23};Storeints1,s2;StoreStudents3;s1.putElem(3);s2.putElem(-7);couts1.getElem()s2.getElem()endl;s3.putElem(g);coutThestudentidiss3.getElem().idendl;}辨析概念函数模板与模板函数•函数模板是模板的定义,定义中用到通用类型参数•模板函数是实实在在的函数定义,它由编译器在遇到具体的函数调用时生成,具有程序代码类模板与模板类•类模板是模板的定义,不是一个实实在在的类,定义中用到通用类型参数•模板类是实实在在的类定义,是类模板的实例化。类定义中的模板参数被实际类型所替代模板参数模板参数可以是:•模板类型参数(templatetypeparameter)它代表了一种类型•模板非类型参数(templatenontypeparameter)它代表了一个常量表达式模板非类型参数•由一个普通的参数声明构成•模板非类型参数表示该参数名代表了一个潜在的值,而该值代表了模板定义中的一个常量•比如:templatetypenameelemType,intsizeelemTypemin(elemType(&arr)[size]);模板参数(续)默认参数•如:templateintlen,intbeg_pos=1classnum_sequencelen,beg_pos{…}•匹配顺序与一般函数的默认参数值一样,从左到右进行模板应用技巧在类模板的定义中,对于成员函数的参数一般采用传址的方式(引用或者指针)boolfind(intval);boolfind(constMatrix&val);templatetypenameelemTypeboolfind(elemType&val);课堂练习试改写以下类,使它成为类模板classexample{public:example(doublemin,doublemax);example(constdouble*array,intsize);double&operator[](intindex);booloperator==(constexample1&)const;boolinsert(constdouble*,int);boolinsert(double);doublemin()const{return_min;}doublemax()const{return_max;}voidmin(double);voidmax(double);intcount(doublevalue)const;private:intsize;double*parray;double_min;double_max;};进一步了解运算符重载赋值运算符重载•与拷贝构造函数的用途一样输入输出运算符重载知识点回顾主要内容•函数模板、类模板、群体类和群体数据的组织达到的目标•理解模板的作用,学会简单的应用。作业(书面作业)模板有哪几种类型?各种类型的定义形式是什么?你认为设计模板有哪些技巧?第四专题用模板进行编程完
本文标题:第4专题 用模板进行编程
链接地址:https://www.777doc.com/doc-3230704 .html