c++程序设计第七章类模板与向量

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

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

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

资源描述

1第七章类模板与向量本章考核要求:1、理解类模板的概念,对比函数模版掌握类模板的特点(对类的描述、简化程序设计),达到“领会”层次。2、熟练掌握类模板的成分以及语法,能根据要求写出类模板,达到“综合应用”层次。3、理解类模板的对象,了解类模板的实例化,达到“领会”层次。4、掌握在类体外定义成员函数的一般格式,达到“简单应用”层次。5、了解类模板的派生与继承,理解模板类集成非模板和从类模板派生一个类模版两种情况,最终达到“领会”层次。6、理解向量的概念,会定义向量列表,达到”领会“层次。7、掌握定义向量使用的基本数据类型,达到“简单应用”层次。对构造类型一般性了解,达到“识记”层次。8、掌握向量容器指定位置插入和删除对象的方法,达到“简单应用”层次。9、了解向量其他的操作方法,达到“识记”层次。2相关知识回顾1、函数的重载函数重载可以使一个函数名具有多种功能,即具有多种形态,称这种特性为。多态性当函数的参数不同,或者参数不同时,函数可以重载。仅有函数返回值不同区分重载函数。类型个数不能有些函数重载时参数个数相同,只是类型不同,此时重载函数比较繁琐,可利用实现。函数模板32、函数模板c++规定模板以关键字和一个形参表开头。template将函数模板与某个具体数据类型连用,就产生了,又称这个过程为函数模板实例化,这种形式就是类型参数化。模板函数例如:Tmax(Ta,Tb){if(ab)returna;elsereturnb;}templateclassT另外,c++还专门定义了一个仅仅用在模板中的关键字,它的用途之一是代替template参数列表中的关键字class。typename函数执行时确定参数类型的函数称为模板函数。42、函数模板函数模板是不能直接执行的,需要实例化为模板函数后才能执行。使用格式:模板函数名类型参数(实参表)(显式比较准则)或者:模板函数名(实参表)(默认方式)5如有函数模板如下:templateclassTTmax(Ta,Tb){if(ab)returna;elsereturnb;}m1=maxint(3,8);m2=maxdouble(3.6,12.5);m3=maxchar('a','A');m1=max(3,8);m2=max(3.6,12.5);m3=max('a','A');或者则对该函数模板的使用有:注:要想省去显式调用的麻烦,条件是由这个调用的函数参数表能够惟一地去标识出模板参数的一个集合。在调用函数模板时,的类型决定到底使用模板的哪个版本。也就是说,模板的参数是由的参数推断出来的。函数参数函数6classPointInt{intx,y;public:PointInt(inta=0,intb=0):x(a),y(b){}voidsetxy(inta,intb){x=a;y=b;}voidshowxy(){coutx,yendl;}intgetx(){returnx;}intgety(){returny;}};classPointFloat{floatx,y;public:PointFloat(floata=0,floatb=0):x(a),y(b){}voidsetxy(floata,floatb){x=a;y=b;}voidshowxy(){coutx,yendl;}floatgetx(){returnx;}floatgety(){returny;}};voidmain(){PointInta(3,4);a.showxy();PointFloatb(1.2,3.4);b.showxy();}分析以下程序的结果(lt7_1a.cpp)7classPointInt{intx,y;public:PointInt(inta=0,intb=0):x(a),y(b){}voidsetxy(inta,intb){x=a;y=b;}voidshowxy(){coutx,yendl;}intgetx(){returnx;}intgety(){returny;}};classPointFloat{floatx,y;public:PointFloat(floata=0,floatb=0):x(a),y(b){}voidsetxy(floata,floatb){x=a;y=b;}voidshowxy(){coutx,yendl;}floatgetx(){returnx;}floatgety(){returny;}};分析以下程序的结果(lt7_1a.cpp)分析PointInt类和PointFloat类的异同?类中的数据成员以及实现的操作相同,只是数据类型不同。为了避免因为类的数据类型不同而产生的重复性设计,可以将这些数据类型从类中分离出来形成一个通用的数据类型T,为这个数据类型T设计一个操作集,就是类模板TTTTTTTTTTTTTT8将数据类型抽象出来而形成的操作集:classPoint{Tx,y;public:Point(Ta=0,Tb=0):x(a),y(b){}voidsetxy(Ta,Tb){x=a;y=b;}voidshowxy(){coutx,yendl;}Tgetx(){returnx;}Tgety(){returny;}};97.1类模板类模板使用户可以为类定义一种模式,使得类中的某些数据成员、成员函数的参数和返回值能取得任意数据类型。类模板用于实现类所需数据的类型参数化。所以类模板也称为参数化类。10一、类模板基础知识1、类模板声明的一般格式:template类模板参数class类名{类体};classPoint{Tx,y;public:Point(Ta=0,Tb=0):x(a),y(b){}voidsetxy(Ta,Tb){x=a;y=b;}voidshowxy(){coutx,yendl;}Tgetx(){returnx;}Tgety(){returny;}};templateclassT例如:模版以template关键字和一个形参表开头。11voidsetxy(Ta,Tb){x=a;y=b;}Point::templateclassTclassPoint{Tx,y;public:Point(Ta=0,Tb=0):x(a),y(b){}voidsetxy(Ta,Tb){x=a;y=b;}voidshowxy(){coutx,yendl;}Tgetx(){returnx;}Tgety(){returny;}};voidsetxy(Ta,Tb){x=a;y=b;}voidsetxy(T,T);TtemplateclassT注:在类体外面定义成员函数时,必须用template重写类模板声明!12注:在类体外面定义成员函数时,必须用template重写类模板声明!(P148)一般格式为:template模板参数返回类型类名模板类型参数::成员函数名(函数参数列表){函数体}指template的内使用class(或typename)声明的类型参数。如上例中的:templateclassTvoidPointT::setxy(Ta,Tb){x=a;y=b;}132、类模板对象类模板不能直接使用,必须先实例化为相应的模板类,定义该模板类的对象后才能使用。初始化类模板时,只要传给它指定的数据类型(如int,float,double等),编译器就用指定的类型代替模板参数产生相应的模板类。用类模板定义对象的一般格式:类名模板实例化参数类型对象名(构造函数实参列表)或者:类名模板实例化参数类型对象名编译器不能从构造函数参数列表推断出模板实例化参数类型,所以必须显式地给出对象的参数类型14例如:templateclassTclassPoint{Tx,y;public:Point(Ta=0,Tb=0):x(a),y(b){}voidsetxy(Ta,Tb){x=a;y=b;}voidshowxy(){coutx,yendl;}Tgetx(){returnx;}Tgety(){returny;}};voidmain(){Pointinta(3,4);a.showxy();Pointfloatb(1.2,3.4);b.showxy();}显式地给出对象的参数类型15例题:分析以下程序结果(lt7_3.cpp)#includeiostreamusingnamespacestd;templateclassT,intsize=4classsum{Tm[size];public:sum(Ta=0,Tb=0,Tc=0,Td=0){m[0]=a;m[1]=b;m[2]=c;m[3]=d;}Ts(){Tadd=0;for(inti=0;isize;i++){add+=m[i];}returnadd;}};voidmain(){sumint,4x(1,2,3,4);sumchar,4y('a',1,-32,1);sumfloat,4z(1.2,2.3,3.4,4.5);coutx.s()endl;couty.s()endl;coutz.s()endl;}16二、类模板的派生与继承类模板也可以继承。声明模板继承之前,必须重新声明类模板。模板类的基类和派生类都可以是模板类或者非模板类,本节只介绍其中两种情况:1、从非模板类派生类模板17classPoint//非模板类{protected:intx,y;public:Point(inta=0,intb=0):x(a),y(b){}voidshowxy(){coutx,yendl;}};templateclassT//从非模板类派生类模板classLine:publicPoint{Tx2,y2;public:Line(inta,intb,Tc,Td):Point(a,b){x2=c;y2=d;}voidsetline(inta,intb,Tc,Td){x=a;y=b;x2=c;y2=d;}voidshowLine(){coutPoint1坐标:;showxy();coutPoint2坐标:;coutx2,y2endl;}Tlength(){returnsqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));}};voidmain(){Lineinta(1,1,1,3);a.showLine();couta线段长度:a.length()endl;Linefloatb(1,1,1.0,5.8);coutb线段长度:b.length()endl;}182,从类模板派生一个类模板类模板使用时,须指出类模板的参数给出类模板参数后得到一个模板类继承后成员的访问权限变化同一般类的继承19classPoint//非模板类{protected:intx,y;public:Point(inta=0,intb=0):x(a),y(b){}voidshowxy(){coutx,yendl;}};templateclassT//从非模板类派生类模板classLine:publicPoint{Tx2,y2;public:Line(inta,intb,Tc,Td):Point(a,b){x2=c;y2=d;}voidsetline(inta,intb,Tc,Td){x=a;y=b;x2=c;y2=d;}voidshowLine(){coutPoint1坐标:;showxy();coutPoint2坐标:;coutx2,y2endl;}Tlength(){returnsqrt((x2-x)*(x2-x)+(y2-y)*(y2-y));}};templateclassTTTT//类模板//从类模板派生类模板Tvoid

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

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

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

×
保存成功