C 程序设计基础模板解析

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

C++面向对象程序设计教程第3章模板3.1模板的概念模板•使用模板可以建立具有通用类型的函数库或类库,为一系列逻辑功能相同而数据类型不同的函数或类创建框架•模板提供了一种重用程序源代码的有效方法,方便了大规模的软件开发模板的概念•模板的本质就是将所处理的数据类型说明为参数,模板是对具有相同特性的函数或类的再抽象,将程序所处理的数据的类型参数化,这样可使一段程序代码能用于处理多种不同类型的数据。•C++程序由类和函数组成,类对应类模板,函数对应函数模板。引入函数模板•考察三个Swap()函数,分别用于交换两个整型数、交换两个浮点实型数以及交换两个双精度实型数•这三个Swap()函数的功能完全一样,只有所处理的数据的类型不同voidSwap(int&x,int&y)//交换整型数x,y{inttemp=x;x=y;y=temp;//通过循环赋值交换x,y}voidSwap(float&x,float&y)//交换浮点实型数x,y{floattemp=x;x=y;y=temp;//通过循环赋值交换x,y}voidSwap(double&x,double&y)//交换双精度实型数x,y{doubletemp=x;x=y;y=temp;//通过循环赋值交换x,y}上面通过函数重载实现了让函数Swap()处理不同类型的数据,要求交换任何一对同一种类型的数据。最好的解决方法是类型参数化,这样就得到了函数模板。使用函数模板定义如下:templateclassElemType//class不是类标识,只表明ElemType是类型参数voidSwap(ElemType&x,ElemType&y)//交换x,y{ElemTypetemp=x;x=y;y=temp;//通过循环赋值交换x,y}这样得到可以将任一类型ElemType的两个数据进行互换的函数模板。引入类模板•三个类Integer、Float和Double分别用来处理整型数、浮点型实数以及双精度实型数•这三种类的处理功能完全一样,只有所处理的数据的类型不同//声明整型类classInteger{private://数据成员intnum;//数据值public://公有函数Integer(intn=0):num(n){}//构造函数voidSet(intn){num=n;}//设置数据值intGet()const{returnnum;}//返回数据值};//声明浮点型实数类classFloat{private://数据成员floatnum;//数据值public://公有函数Float(floatn=0):num(n){}//构造函数voidSet(floatn){num=n;}//设置数据值floatGet()const{returnnum;}//返回数据值};//声明双精度实型数类classDouble{private://数据成员doublenum;//数据值public://公有函数Double(doublen=0):num(n){}//构造函数voidSet(doublen){num=n;}//设置数据值doubleGet()const{returnnum;}//返回数据值};•上面实现的三个类的功能相同,处理不同类型的数据,采用类型参数化后就可以处理任何类型,这样就得到了类模板。使用类模板定义如下:templateclassElemTypeclassNumber{private://数据成员ElemTypenum;//数据值public://公有函数Number(ElemTypen=0):num(n){}//构造函数voidSet(ElemTypen){num=n;}//设置数据值ElemTypeGet()const{returnnum;}//返回数据值};•函数模板或类模板是对一族函数或类的描述,模板是使用类型参数来产生一组函数或类的机制。3.2函数模板及模板函数3.2.1函数模板及模板函数•函数模板是对一批功能相同的函数的说明,它不是某一个具体的函数,是带有“类型参数”的一种描述•模板函数是将函数模板内的“数据类型参数”取某一个具体的数据类型后得到的具体函数函数模板的声明•使用函数模板的方法是先声明函数模板,最后才可以调用模板函数。函数模板的一般声明格式如下:templateclass类型参数名1,class类型参数名2,…返回值类型函数模板名(形参表){……//函数模板体}•或templatetypename类型参数名1,typename类型参数名2,…返回值类型函数模板名(形参表){……//函数模板体}template是一个声明模板的关键字class在此处并不表示类的意思,只是借用此关键字表示其后是一个类型参数。class类型参数名1,class类型参数名2,…称为类型形参表class和typename的作用相同,都是表示“类型名”,二者可以互换生成模板函数•在使用函数模板时,用实际的数据类型具体化(实例化)类型形式参数,再根据实际参数类型,生成一个具体的模板函数,模板函数的函数体与函数模板的函数模板体完全相同,在程序中真正执行的代码是模板函数的代码•在使用函数模板生成模板函数时,有两种使用方式:函数模板名(实参表)•或函数模板名类型1,类型2,…(实参表)•第一种使用方式将根据实参类型确定类型形式参数的具体类型,第二种方式中,类型1,类型2,…称为类型实参表,用类型实参表中的类型来确定类型形式参数具体类型只有一个类型形参的函数模板•类型形参表与类型实参表通常只包含一个类型,这时函数模板的一般声明格式如下:templateclass类型参数名返回值类型函数模板名(形参表){……//函数模板体}•或templatetypename类型参数名返回值类型函数模板名(形参表){……//函数模板体}•使用函数模板生成模板函数的两种使用方式如下:函数模板名(实参表)•或函数模板名类型(实参表)例3.1函数模板定义与模板函数的调用示例。templateclassElemTypeElemTypeMax(ElemTypex,ElemTypey)//求x,y的最大值{returnxy?y:x;//返回x,y的最大值}intmain()//主函数main(){cout2和3的最大值为Max(2,3)endl;//输出2,3的最大值//cout2和3.0的最大值为Max(2,3.0)endl;//错,无法根据2,3.0确定类型形式参数的具体类型cout2和3.0的最大值为Maxint(2,3.0)endl;//输出2,3.0的最大值system(PAUSE);//调用库函数system(),输出系统提示信息return0;//返回值0,返回操作系统}程序运行时屏幕输出如下:2和3的最大值为32和3.0的最大值为3请按任意键继续...3.2.2重载函数模板•模板函数类似于重载函数,但是同一个函数模板类型形式参数具体化(实例化)后的所有模板函数必须执行相同的代码,而函数重载时在每个函数体中可以执行不同的代码,当遇到执行的代码有所不同时,不能简单地套用函数模板,而应像重载普通函数那样进行重载•重载函数模板后,编译器首先匹配类型完全相同的函数,如果匹配失败,再寻求函数模板进行匹配例3.2重载函数模板与匹配过程示例。templateclassElemTypeElemTypeMax(ElemTypex,ElemTypey)//求x,y的最大值{returnxy?y:x;//返回x,y的最大值}char*Max(char*str1,char*str2)//求str1,str2的最大值{returnstrcmp(str1,str2)0?str2:str1;//返回str1,str2的最大值}intmain()//主函数main(){cout2和3的最大值为Max(2,3)endl;//输出2,3的最大值,匹配函数模板coutChina与American的最大值为Max(China,American)endl;//输出China,American的最大值,匹配函数system(PAUSE);//输出系统提示信息return0;//返回值0,返回操作系统}程序运行时屏幕输出如下:2和3的最大值为3China与American的最大值为China请按任意键继续...例3.3重载函数模板示例。templateclassElemTypeElemTypeMax(ElemTypex,ElemTypey)//求x,y的最大值{returnxy?y:x;//返回x,y的最大值}templateclassElemTypeElemTypeMax(ElemTypex,ElemTypey,ElemTypez)//求x,y,z的最大值{ElemTypem=xy?y:x;//m为x,y的最大值m=mz?z:m;//m,z的最大值returnm;//返回最大值}templateclassElemTypeElemTypeMax(ElemTypea[],intn)//求a[0],a[1],...,a[n-1]的最大值{ElemTypem=a[0];//假设a[0]为最大值for(inti=1;in;i++)if(ma[i])m=a[i];//如a[i]更大,则将a[i]赋值给mreturnm;//返回最大值}intmain()//主函数main(){inta[]={1,9,7,5,6,3};//定义数组acout数组a的最大元素值为Max(a,6)endl;cout2和3的最大值为Max(2,3)endl;cout2,3和8的最大值为Max(2,3,8)endl;system(PAUSE);//输出系统提示信息return0;//返回值0,返回操作系统}程序运行时屏幕输出如下:数组a的最大元素值为92和3的最大值为32,3和8的最大值为8请按任意键继续...3.3类模板及模板类类模板及模板类•类模板与函数模板类似,它可以为任意数据类型定义一种模板,使用不同的数据类型具体化(实例化)类模板生成具体的模板类•模板类可以用于生成具体的对象••••类模板的声明及生成模板类•定义一个类模板与定义函数模板的格式类似,必须以关键字template开始,类模板的一般声明形式如下:templateclass类型参数名1,class类型参数名2,…class类模板名{……//类模板体};•或templatetypename类型参数名1,typename类型参数名2,…class类模板名{……//类模板体};类模板的声明•类模板的成员函数不但可以在类模板内定义,也可以在类模板外定义。在类模板外定义时,需要采用下面的形式:templateclass类型参数名1,class类型参数名2,…返回值类型类模板名类型参数名1,类型参数名2,…::成员函数名(形参表){……//函数体}•或templatetypename类型参数名1,typename类型参数名2,…返回值类型类模板名类型参数名1,类型参数名2,…::成员函数名(形参表){……//函数体}生成模板类•类模板必须用实际的数据类型具体化(实例化)类型形式参数,再根据实际参数类型,生成一个具体的模板类,然后才能用来生成具体对象。•一般语法格式如下:类模板名类型1,类型2,…对象名;例3.4使用类模板的实例。//声明数组类模板templateclassElemTypeclassArray{private://数据成员ElemType*elem;//存储数据元素值intsize;//数组元素个数

1 / 32
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功