(10)--3.8类模版面向对象程序设计.ppt
函数模板函数模板 概念:概念:建立一个通用函数,其函数类型和形参类型不具体指定,用一个虚拟的类型来代表。这个通用函数就称为函数模板 特点:特点:凡是函数体相同的函数都可以用这个模板来代替,不必定义多个函数,只须在模板中定义一次即可。函数模板函数模板 一般形式:一般形式:template 通用函数定义或template 通用函数定义函数模板函数模板 声明函数模板声明函数模板 调用模板函数调用模板函数template/模板声明模板声明,其中的其中的T为类型参数型参数 T max(T a,T b,T c)/定定义一个通用函数一个通用函数,用用T作虚作虚拟的的类型名型名 if(ba)a=b;if(ca)a=c;return a;int i1=185,i2=-76,i3=567,i;double d1=56.87,d2=90.23,d3=-3214.78,d;long g1=67854,g2=-912456,g3=673456,g;i=max(i1,i2,i3);/调用模板函数用模板函数,此此时T被被int取代取代d=max(d1,d2,d3);/调用模板函数用模板函数,此此时T被被double取代取代g=max(g1,g2,g3);/调用模板函数用模板函数,此此时T被被long取代取代类模版模版 何时使用:何时使用:有两个或多个类,其功能是相同的,仅仅是数据类型不同时,考虑使用类模版。class Compare_intpublic:Compare(int a,int b)x=a;y=b;int max()return(xy)?x:y;int min()return(xy)?x:y;float min()return(xy)?x:y;private:float x,y;类模版模版 声明类模版:声明类模版:template /声明一个模板,虚声明一个模板,虚拟类型名型名为numtypeclass Compare /类模板名模板名为Comparepublic:Compare(numtype a,numtype b)x=a;y=b;numtype max()return(xy)?x:y;numtype min()return(xy)?x:y;private:numtype x,y;类模版模版 使用类模版:使用类模版:一般形式:一般形式:类模板名类模板名 对象名对象名(参数表参数表););Compare cmp(4,7);程序程序实例例使用使用类模版比模版比较大小数大小数#includeusing namespace std;template/声明声明类模板模板,虚虚拟类型名型名为numtypeclass Compare /类模板名模板名为Comparepublic:Compare(numtype a,numtype b)/定定义构造函数构造函数 x=a;y=b;numtype max()/函数函数类型型暂定定为numtypereturn(xy)?x:y;numtype min()return(xy)?x:y;private:numtype x,y;/数据数据类型型暂定定为numtype;程序程序实例例使用使用类模版比模版比较大小数大小数int main()Compare cmp1(3,7);/定定义对象象cmp1,用于两个整数的比用于两个整数的比较coutcmp1.max()is the Maximum of two integer numbers.endl;coutcmp1.min()is the Minimum of two integer numbers.endlendl;Compare cmp2(45.78,93.6);/定定义对象象cmp2,用于两个浮点数的比用于两个浮点数的比较coutcmp2.max()is the Maximum of two float numbers.endl;coutcmp2.min()is the Minimum of two float numbers.endlendl;Compare cmp3(a,A);/定定义对象象cmp3,用于两个字符的比用于两个字符的比较coutcmp3.max()is the Maximum of two characters.endl;coutcmp3.min()is the Minimum of two characters.endl;return 0;类模版模版 在类模板外定义成员函数:在类模板外定义成员函数:templatenumtype Compare:max()return(xy)?x:y;类模版模版 声明和使用类模板的一般步骤:声明和使用类模板的一般步骤:先写出一个实际的类。先写出一个实际的类。将此类中准备改变的类型名改用一个自己指定的虚拟类型名。将此类中准备改变的类型名改用一个自己指定的虚拟类型名。在类声明前面加入一行,格式为在类声明前面加入一行,格式为 templateclass template 例如:例如:templatetemplate/注意本行末尾无分号注意本行末尾无分号class Compare class Compare ;/类体类体类模版模版 声明和使用类模板的一般步骤:声明和使用类模板的一般步骤:用类模板定义对象时用以下形式用类模板定义对象时用以下形式:类模板名类模板名 对象名对象名;类模板名类模板名 对象名对象名(实参表实参表););例如例如 Compare cmp;Compare cmp;Compare cmp(3,7);Compare cmp(3,7);如果在类模板外定义成员函数,应写成类模板形式如果在类模板外定义成员函数,应写成类模板形式:templateclass template 函数类型函数类型 类模板名类模板名 成员函数名成员函数名(函数形参表函数形参表)类模版模版 说明:说明:类模板的类型参数可以有一个或多个,每个类型前面都必须加类模板的类型参数可以有一个或多个,每个类型前面都必须加classclass和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对和使用类一样,使用类模板时要注意其作用域,只能在其有效作用域内用它定义对象。象。模板可以有层次,一个类模板可以作为基类,派生出派生模板类。模板可以有层次,一个类模板可以作为基类,派生出派生模板类。小小结函数模板1类模板2