EC+面向对象程序设计 计算机与信息学院 罗宪
C++面向对象程序设计 计算机与信息学院 罗宪
第六章模板 本章主要内容: >模板的概念 >函数模板 >类模板
第六章 模板 本章主要内容: ➢模板的概念 ➢函数模板 ➢类模板
第一节模板的概念 问题的提出: C++语言是一种强类型语言,因此象求二个数的最大 值函数时,不同类型的数据需要用重载的方式实现。 如 int max(int x,int y) i return x>y?x: y;i float max(float x, float y) i return x>y?x: y; double max(double x, double y) i return x>y?x: y; 三个函数的实现方法是相同的,只不过数据类型不 样 >问题:能否使这一类向题只写一代码来观? >解决的办法:采用模板实现
第一节 模板的概念 一、问题的提出: ➢C++语言是一种强类型语言,因此象求二个数的最大 值函数时,不同类型的数据需要用重载的方式实现。 如: int max(int x,int y) { return x>y?x:y;} float max(float x,float y) { return x>y?x:y;} double max(double x,double y) { return x>y?x:y;} ➢三个函数的实现方法是相同的,只不过数据类型不一 样。 ➢问题:能否使这一类问题只写一段代码来实现? ➢解决的办法:采用模板实现
第一节模板的概念 #includesiostream.h> # template eI max(Ix,I y return x>y?x:y;) void main( { int il=10,i2=20; float fl=30.5,f2=13.9 double dl=48.255,d2=36358; char cl='A’,c2=a cout<< the max of il, i2 is: <<max(i1, i2)<<endl; cout <<the max of fl, f2 is: <<max(f1, f2)<<endl cout <<the max of dl, d2 is: <<max(dl, d2)<<endl; cout <<the max of cl, c2 is: " <<max(cl, c2)<<endl;
第一节 模板的概念 二、模板的概念 ➢例【6.1】用函数模板实现不同类型的二个数最大值 的计算。 #include #include template T max(T x,T y) {return x>y?x:y;} void main() {int i1=10,i2=20; float f1=30.5,f2=13.9; double d1=48.255,d2=36.358; char c1='A',c2='a'; cout <<"the max of i1,i2 is:"<<max(i1,i2)<<endl; cout <<"the max of f1,f2 is:"<<max(f1,f2)<<endl; cout <<"the max of d1,d2 is:"<<max(d1,d2)<<endl; cout <<"the max of c1,c2 is:"<<max(c1,c2)<<endl; }
第一节模板的概念 模板—实现代码重用的一种工具实现类型参数 化:即把类型定义为一种参数(模板的实质) 三、模板的分类 >函数模板 亠>类模板。 模板 (函数模板、类模板) 实例化 实例化 匚模板函数 模板类 实例化 对象
第一节 模板的概念 ➢模板——实现代码重用的一种工具——实现类型参数 化:即把类型定义为一种参数(模板的实质)。 三、模板的分类 ➢函数模板 ➢类模板。 模 板 (函数模板、类模板) 模板函数 对 象 模板类 实例化 实例化 实例化
第二节函数模板(教材①P316327) 、函数模板的定义 template 返回类型函数名(形参表) 函数体 其中: template为模板函数的声 明 class t1 class t2,为模板形参T1、T2为虚拟 类型参数。 >可把模板形参改为: typename T1, typename T2
第二节 函数模板(教材①P316-327) 一、函数模板的定义 template 返回类型 函数名(形参表) { 函数体 } 其中: ➢template为模板函数的声 明 ➢ class T1,class T2,…为模板形参——T1、T2为虚拟 类型参数。 ➢可把模板形参改为:typename T1,typename T2,…
第二节函数模板(教材①P316327) 例【62】定义一个函数模板swap(),使之能实现二个 整数的交换、二个双精度数的交换、二个点( point 类)的交换。( point类的定义在 hhpoint h中) #includesiostream.h> #include hhpoint h ∥ template∥模板函数声明 template∥模板函数声明 void swap(t &a,T&b) fT temp temp=a; a=b; b=temp;
第二节 函数模板(教材①P316-327) 例【6.2】定义一个函数模板swap( ),使之能实现二个 整数的交换、二个双精度数的交换、二个点(point 类)的交换。(point类的定义在hhpoint.h中) #include #include"hhpoint.h" //template //模板函数声明 template //模板函数声明 void swap(T &a,T &b) { T temp; temp=a;a=b;b=temp; }
第二节函数模板(教材①P316327) s void main(void) {inti=20j=30; double x=80.5, y=92.6; point pl(40,50),p2(70,80); swap(i,);/将模板函数实例化为整型数据交换 cout<<ni=<<i<<i=w<<i<<endl swap(x,y);/将模板函数实例化为双精度型数据交换 cout<< nx=<<x<<y=<<y<<endl swap(pn2)/将模板函数实例化为 point类的数据交换 cout<<inpl: pl printo; cout<<\np2: ";p2 printo;
第二节 函数模板(教材①P316-327) void main(void) { int i=20,j=30; double x=80.5,y=92.6; point p1(40,50),p2(70,80); swap(i,j);//将模板函数实例化为整型数据交换 cout<<"\ni="<<i<<" j="<<j<<endl; swap(x,y);//将模板函数实例化为双精度型数据交换 cout<<"\nx="<<x<<" y="<<y<<endl; swap(p1,p2);//将模板函数实例化为point类的数据交换 cout<<"\np1:";p1.print(); cout<<"\np2:";p2.print(); }
第二节函数模板(教材①P316327) 二、模板函数的实例化 >模板函数是在调用时根据实参的数据类型实例化的: ★swap(j);或sWap()实参为 int型实例化为swap(int&a,int&b) 女 swap(x, y)}—或swap(xy) 实参为 double型实例化为 swap(double &a, double &b) ☆sWap(P1p2)—或 swap(p1p2)实参为poin型一 实例化为 swap(point &a, point &b)
第二节 函数模板(教材①P316-327) 二、模板函数的实例化 ➢模板函数是在调用时根据实参的数据类型实例化的: swap(i,j);——或swap(i,j);——实参为 int型——实例化为swap(int &a,int &b) swap(x,y);——或swap(x,y);—— 实参为double型——实例化为 swap(double &a,double &b) swap(p1,p2); ——或 swap(p1,p2);——实参为point型— —实例化为 swap(point &a,point &b)
第二节函数模板(教材①P316327) 函数模板 swap &a,T&b) 模板函数 模板函数 模板函数 int ii: doublex point pl, p2 swap(i,j); swap(x, y) swap(pl, p2);
第二节 函数模板(教材①P316-327) 函数模板 swap(T &a,T&b) 模板函数 int i,j; swap(i,j); 模板函数 double x,y; swap(x,y); 模板函数 point p1,p2; swap(p1,p2);