




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
培训体系++中级培训教材附件三:教材模板说明:一、为便于保存和管理,各类培训教材均采用合订本。二、教材结构:各类培训教材由教材封面、前言、课程目录、单门课程教材和封底五部分构成。感谢阅读三、教材封面:1、封面颜色:教材封面为彩色,工作基本常识教材为深蓝色,技术基础知识教材精品文档放心下载为草绿色,管理基础知识教材为浅蓝色,营销基础知识教材为墨绿色。谢谢阅读2、教材名称:采用“工作基本常识”“技术基础知识”“管理基础知识”“营销精品文档放心下载基础知识”,字体为隶书,黑体,60号。3、其他标识:员工培训中心编辑采用宋体、黑体、三号,位于教材名称下面;华谢谢阅读精品文档放心下载司和员工培训中心编辑之间;右上角为保密标识,楷体,黑体,四号。感谢阅读四、教材封底:谢谢阅读面的右下角。五、前言:教材前言为各类培训的目的、课程门类、特点、主要内容的简介。谢谢阅读六、课程目录:为各门课程排列顺序的目录,统一编排页码,便于学员查找。谢谢阅读七、单门课程教材:感谢阅读和相关网站组成。1、课程封面:课程封面为彩色,课程名称为隶书、60号、黑体、黑色,左上角为课程编码。感谢阅读2、章节目录:为宋体、小四、黑色3、章节内容:(1)标题:章节目分别以“第一章、第二章、第三章”“1.1、1.2、1.3”和感谢阅读“(1)(2)(3)”来表示。章为宋体、小二、黑体,节为宋体、四号、黑体,谢谢阅读目为宋体、小四、黑体。(210000——20000字之间。教材文精品文档放心下载字一般为宋体、小四、黑色,行间距为一行半。(3)内容:章节内容要有完整的理论体系,不能成为授课胶片的翻版。
4、学习要求:精品文档放心下载每章标题下面为本章的学习要求,以明确本章要掌握的要点。文字为楷体、小四。精品文档放心下载5、思考题:每章最后要有思考题,以便帮助学员复习、思考。6、参考资料和相关网站:有参考资料和相关网站的要附在课程后面,以便帮助学员查阅。感谢阅读内部资料,注意保密C++中级培训教程员工培训中心编辑2005年6月V1.0华为技术有限公司前言C++语言中级教材讲授C++语言的运用技术,包括:类、对象之间的关系、对象的存储与布局、运算符重载、智能指针、仿函数、泛型编程,C++模式设计基本精品文档放心下载思想。华为技术NE002009cV1.01业务与软件C++语言项目C++进阶目录第一章类、接口…………………7谢谢阅读1.1Handle-Body与接口、抽象接口…………7精品文档放心下载1.2多继承、与菱形缺陷、this跳转等………13感谢阅读1.3C++多态的两种多态形式和区别……………18感谢阅读第二章重载………………………18谢谢阅读2.1函数重载………………………19谢谢阅读2.2运算符重载…………………20感谢阅读第三章模板………………………29谢谢阅读3.1模块函数……………………29感谢阅读3.2模块类……………31谢谢阅读3.3STL标准模板库…………………34感谢阅读附录:参考资料………………………39感谢阅读前言我们在C++基础课程中已经了解了C++精品文档放心下载C++面向对象的基本特征,本课程主要是更进一步探讨一下C++一些基本模型的谢谢阅读应用,加深对概念的理解,由于课程时间有限,C++,模型和内容又如此之多,对任何一个模型都精品文档放心下载无法深入进去,所以只能泛泛而谈。第一章类、接口学习要求:1、了解类的继承、封装等概念之间的关系2特点。学会使用接口编程的思想本章节主要介绍C++中的类、接口。类,包涵了一组数据和一组基于数据上的一精品文档放心下载谢谢阅读的行为。有关类的基本概念:ClassnamesClassmembersMemberFunctionsStaticMemberFunctionsUnionsC++BitFieldsNestedClassDeclarationsTypeNamesinClassScopeMultipleBaseClassesVirtualFunctionsAbstractClassesControllingAccesstoClassMembers感谢阅读privateMembersprotectedMemberspublicMembersAccessSpecifiersforBaseClassespriavtepublic、精品文档放心下载protectedFriendsConstructorsDestructorsConversionFunctionsthenewoperatorandthedeleteoperator谢谢阅读CopyingConstructorFunctions谢谢阅读Interface1.1Handle-Body与接口、抽象接口在C++精品文档放心下载但是C++的封装是不完全的,编译器必须知道一个对象的所有部分的声明,以便创建和感谢阅读感谢阅读实现部分隐藏起来。C++在编译期间要尽可能多地做静态类型检查。这意味着尽早捕感谢阅读获错误,也意味着程序具有更高的效率。然而这对私有的实现部分来说带来两个影响:精品文档放心下载谢谢阅读复编译。然而C++C++的类既是描述了一精品文档放心下载个接口同时也描述了实现的过程,示例如下:classCMyString{private:constintm_cch;char*m_psz;public:CMyString(constchar*psz);感谢阅读~CMyString();intLength()const;intIndex(constchar*psz)const;感谢阅读}CMyStirng对外过多的暴露了内存布局实现的细节,这些信息过度的依赖于这些成员变感谢阅读精品文档放心下载的接口不利于跨语言跨平台的软件开发和移植。1.1.1Handle-Body模式handleclasses叫“Cheshire谢谢阅读1]。有关实现的任何东西都消失了,只剩一个单一的指针“m_pThis”。该指针指向一谢谢阅读谢谢阅读精品文档放心下载实现文件进行重新编译,然后再连接到项目中。感谢阅读指定的类指针。classCMyStringHandle{private:classCMyString;CMyString*m_pThis;public:CMyStringHandle(constchar*psz);感谢阅读~CMyStringHandle();intLength()const;intIndex(constchar*psz)const;感谢阅读};CMyStringHandle::CMyStringHandle(constchar*psz)感谢阅读:m_pThis(newCMyString(psz));精品文档放心下载{}CMyStringHandle::~CMyStringHandle()谢谢阅读{deletem_pThis;}intCMyStringHandle::Length()感谢阅读{returnm_pThis->Length();}intCMyStringHandle::Index(constchar*psz)感谢阅读{returnm_pThis->Index(psz);精品文档放心下载}这是所有客户程序员都能看到的。这行classCMyString;精品文档放心下载器,cheshire是一个结构的名字,但没有提供有关该结构的任何东西。这对产生一个感谢阅读谢谢阅读对象。在这种技术里,包含具体实现的结构主体被隐藏在实现文件中。感谢阅读Handle-Body模式,Handle-Body只含有一个实体指针,精品文档放心下载服务的数据成员永远被封闭在服务系统中。Handle-Body模式如下:classHandlem_pThisclass图1Handle-Body模式(句柄类做为接口)Handle-Body的布局结构永远不会随着实现类数据成员的加入或者删除或者修改而导致感谢阅读Handle-Body的修改,即Handle-Body协议不依赖于C++实现类的任何细节。这就有效的感谢阅读对用户的编译器隐藏了这些斜街,用户在使用对这项技术时候,Handle-Body接口成谢谢阅读了它唯一的入口。然而Handle-Body模式也有自己的弱点:1、精品文档放心下载造和一个析构的类来说显然不构成负担,但是如果一个庞大的类库,它有上感谢阅读百上千个方法时候,光是编写这些方法传递就有可能非常冗长,这也增加了精品文档放心下载出错的可能性。2、感谢阅读不理想3、由于句柄的存在依然存在编译连接器兼容性问题。接口和实现分离的Handle-Body。1.1.2抽象接口技术的Handle-Body解决了编译器/链接器的大部精品文档放心下载分问题,而C++面向对象编程中的抽象接口同样是运用了“接口与实现分离”的思想,精品文档放心下载而采用抽象接口对于解决这类问题是一个极其完美的解决方案。谢谢阅读1、抽象接口的语言描述:classIMyString{virtualintLength()const=0;//这表示是一个纯虚函数,具有纯感谢阅读虚函数的接口virtualintIndex(constchar*psz)const=0;谢谢阅读};2、抽象接口的内存结构:图2抽象接口的内存布局3、抽象接口的实现代码:接口:classIMyString{virtualintLength()const=0;//这表示是一个纯虚函数,感谢阅读具有纯虚//函数的接口virtualintIndex(constchar*psz)const=0;精品文档放心下载};实现:classCMyString:publicIMyString精品文档放心下载{private:constintm_cch;char*m_psz;public:CMyString(constchar*psz);感谢阅读virtual~CMyString();intLength()const;intIndex(constchar*psz)const;谢谢阅读}从上面采用抽象接口的实例来看,抽象接口解决了Handle-Body所遗留下来的全精品文档放心下载部缺陷。抽象接口的一个典型应用:抽象工厂(AbstractFactroy)图3抽象工厂模式1.2多继承与菱形缺陷、this跳转等多重继承是C++语言独有的继承方式,其它几乎所有语言都秉承了单一继承的思精品文档放心下载想。这是因为多重继承致命的缺陷导致的:1.2.1菱形缺陷B从A1和感谢阅读A2两个类多重继承而来,这样B类就包含A1、A2类的数据成员副本。谢谢阅读考虑如果A1、A2都从某基类派生,该基类称为Base,现在继承关系如下:感谢阅读图4菱形继承关系我们C++语言来描述这种继承关系:classBase{……};classA1:publicBase{……};精品文档放心下载classA2:publicBase{……};精品文档放心下载classB:publicA1,publicA2{……};精品文档放心下载那么A1、A2都具有Base的副本。这样B就包含了Base的两个副本,副本发生了重精品文档放心下载叠,不但增加了存储空间,同时也引入了二义性。这就是菱形缺陷,菱形缺陷时感谢阅读间是两个缺陷:1、子对象重叠2、向上映射的二义性。菱形缺陷的其中一种解决办法将在C++世界里最广泛的使用虚拟继承解决菱形缺陷的应用便是标准C++的输入/输谢谢阅读出iostream;图5标准C++的输入/输出1.2.2多重接口与方法名冲突问题(Siamesetwins)精品文档放心下载精品文档放心下载原型”的虚函数情况就不那么容易了。提出问题:假设汽车最大速度的接口为ICarIBoat谢谢阅读ICarIBoat精品文档放心下载两种交通工具的最大速度特性,我们定义它的接口为ICarBoat;精品文档放心下载classICar{virtualintGetMaxSpeed()=0;精品文档放心下载};classIBoat{virtualintGetMaxSpeed()=0;感谢阅读};我们先对ICarBoat的接口做一个尝试:classCCarBoat{virtualintGetMaxSpeed(//既完成ICar的GetMaxSpeed()接口方精品文档放心下载法又//完成IBoat的接口方法?显然不能够};解决问题:显然上面这个尝试根本就无法成功,只用一个实现方法,怎么能够求出这个精品文档放心下载ICarBoat精品文档放心下载速度呢。ICarBoat要返回两个感谢阅读答案就必须有两个方法了,我们假设一个方法是求在陆地上奔跑的速度,名称为谢谢阅读GetCarMaxSpeed();另一个方法是求在大海上航行的最大速度,名称为精品文档放心下载GetBoatMaxSpeed();那这两个方法又怎么和GetMaxSpeed()接口方法联系起来呢;谢谢阅读精品文档放心下载classIXCar:publicICar{virtualintGetMaxSpeed(){GetCarMaxSpeed();}virtualintGetCarMaxSpeed()=0;感谢阅读};classIXBoat:publicIBoat{virtualintGetMaxSpeed(){GetBoatMaxSpeed();}virtualintGetBoatMaxSpeed()=0;感谢阅读};classCCarBoat:publicIXCar,publicIXBoat谢谢阅读{virtualintGetCarMaxSpeed()谢谢阅读{……}virtualintGetBoatMaxSpeed()感谢阅读{……}};图6多重接口与方法名冲突问题1.2.3this跳转this跳转是指的“对象同一性”问题。精品文档放心下载或者父类的this指针永远相等。即如果有下面的模型:感谢阅读图7B从A继承的关系图那么对于一个已经实例化B类的对象bObject,永远有(B*)&bObject精品文档放心下载==(A*)&bObject成立。但是在多继承的世界内,上面的等式就不能恒成立,对象的同一性受到了挑战。感谢阅读图四感谢阅读化B类的对象bObject;(Base*)(A1*)&bObject!=(Base*)(A2*)&bObject成谢谢阅读立,当这种事情发生的时候我们就只能特殊处理了。这种情况在COM应用中处处都会发感谢阅读生。1.3C++多态的两种多态形式和区别C++有两种多态多态形式:1、编译时刻多态,编译时刻多态依靠函数重载或者模板实现谢谢阅读2、运行时刻多态。运行时刻多态依靠需函数虚接口实现精品文档放心下载第二章重载学习要求:1、了解什么是函数重载,什么是运算符重载2、学会运用智能指针,仿函数在C++精品文档放心下载精品文档放心下载新定义C++的内嵌运算符的方法。有关重载的基本概念:OverloadedFunctionsOverloadedOperatorsDeclarationMatchingArgumentMatchingArgumentTypesMatchingArgumentCountsMatchingC++UnaryOperatorsBinaryOperatorsSmartPointerFunctionobjects1.1函数重载函数重载方法是在当前范围内选择一个最佳匹配的函数声明供调用该方法者使精品文档放心下载适合是指按下谢谢阅读列顺序匹配的符合下面条件的:1、一个精确匹配的函数被找到2、一个参数只有细微的差别,几乎可以忽略不计的。3、象类似通过子类向父类转化达到参数匹配的4、通过正常转化函数进行类型转换,能够达到参数匹配到的。感谢阅读5、通过用户自定义的转化函数(如转化运算符或者构造函数)达到参数匹配的精品文档放心下载6、参数是采用省略符号函数重载的方法基本上有:1、根据函数参数数据类型的不同进行的重载;2、根据参数个数的不同进行的重载;3、缺省参数上的重载精品文档放心下载在使用缺省参数时必须记住两条规则。第一,只有参数列表的后部参数才可是缺省的,谢谢阅读感谢阅读谢谢阅读放在函数声明中。第四,缺省参数可以让声明的参数没有标识符。精品文档放心下载4、返回值重载特别注意,在C++中并没有根据返回返回值的不同进行重载的,即我们不感谢阅读能定义这样的函数:voidf();intf();在C++中这样的函数声明方法是被禁止的,但是我们有时间可能又需要这样的重精品文档放心下载载方法,我们又怎么实现呢,其实很简单,jiang函数的参数进行扩展,将这个函数返精品文档放心下载回值的数据类型,做为扩展参数的数据类型来。如下:voidf(void);voidf(int);感谢阅读时刻并不起到传值作用,模板中经常都应用到了这种方法。感谢阅读1.2运算符重载你可以重新定义C++绝大多数内嵌运算符的实现方法和功能,这些重定义的或者感谢阅读谢谢阅读现可能以类的成员函数的形式出现,也有可能以全局性的函数的身份出现。谢谢阅读在C++中重载运算符的名字为operatorx,在这里x精品文档放心下载重载operator+精品文档放心下载定义就可以了,例如:Classcomplex//verysimplifiedcomplex谢谢阅读{doublere,im;public:complex(doubler,doublei):re(r),im(i){};谢谢阅读complexoperator+(complex);精品文档放心下载complexoperator*(complex);精品文档放心下载};定义了complex这个复数的一个简单的实现概念模型。一个复数是由一对谢谢阅读double类型的数据组成,并定义了这个复数的两个方法,加法运算感谢阅读complex::operartor+()和乘法运算complex::operator*().现在我们就能够实现谢谢阅读下面的复数表达式了:voidf(){complexa=complex(1,3.1);谢谢阅读complexb=complex(1.2,2);感谢阅读complexc=b;a=b+c;b=b+c*a;c=a*b+complex(1,2);感谢阅读}1.3.1C++可重载的和C++不可重载的运算符可重载运算符表:OperatorNameTypeOperatorNameType精品文档放心下载,CommaBinary–>*Pointer-to-memberBinary谢谢阅读selection!LogicalNOTUnary/DivisionBinary精品文档放心下载!=InequalityBinary/=Division/assignmentBinary精品文档放心下载%ModulusBinary<LessthanBinary谢谢阅读%=Modulus/assignmentBinary<<LeftshiftBinary精品文档放心下载&BitwiseANDBinary<<=LeftBinary精品文档放心下载shift/assignment&Address-ofUnary<=LessthanorequalBinary精品文档放心下载to&&LogicalANDBinary=AssignmentBinary感谢阅读&=BitwiseAND/assignBinary==EqualityBinary精品文档放心下载()Functioncall—>GreaterthanBinary精品文档放心下载*MultiplicationBinary>=GreaterthanorBinary谢谢阅读equalto*PointerdereferenceUnary>>RightshiftBinary谢谢阅读*=Multiplication/assigBinary>>=RightBinary感谢阅读nshift/assignment+AdditionBinary[]Arraysubscript—谢谢阅读+UnaryPlusUnary^ExclusiveORBinary谢谢阅读++Increment1Unary^=ExclusiveBinary感谢阅读OR/assignment+=Addition/assignmentBinary|BitwiseinclusiveBinary谢谢阅读OR–SubtractionBinary|=BitwiseinclusiveBinary感谢阅读OR/assignment–UnarynegationUnary||LogicalORBinary谢谢阅读––Decrement1Unary~One’scomplementUnary感谢阅读–=Subtraction/assignBinarydeletedelete—谢谢阅读–>MemberselectionBinarynew精品文档放心下载不可重载运算符表:OperatorName.Memberselection.*Pointer-to-memberselection谢谢阅读::Scoperesolution?:Conditional#Preprocessorsymbol##Preprocessorsymbol在上面可重载的运算符可以看出运算符重载共分为两类:一元运算符重载和二元运算感谢阅读符重载一元运算符重载:在声明一个类的非静态的一元运算符重载函数时,你必须声明的形式如感谢阅读下:ret-typeoperatorop()(1)在这里ret-type是指返回数据类型op是指一元运算符谢谢阅读在声明一个全局的一元运算符重载函数时,你必须声明的形式日下:精品文档放心下载ret-typeoperatorop(arg)(2)精品文档放心下载在这里ret-type与op和上面的意思一样,arg是指这个运算符所作谢谢阅读用的数据类型二元运算符重载:在声明一个类的非静态的二元运算符重载函数时,你必须声明的形式如谢谢阅读下:ret-typeoperatorop(arg)(3)精品文档放心下载(3)式和二式基本相同arg可以是任何一个在声明一个全局的二元运算符重载函数时,你必须声明的形式日下:谢谢阅读ret-typeoperatorop(arg1,arg2)(4)精品文档放心下载在这里ret-type与op和上面的意思一样,arg1,arg2,是指这个运精品文档放心下载算符所作用两个数据类型1.3.2几类特殊的运算符重载1、类型转换运算符精品文档放心下载定义的数据类型,如:classCString{……operatorLPCSTR()const;……};应用:CStringstr=“12345”;LPCSTRlpsz=str;//此处会进行LPCSTR运算谢谢阅读感谢阅读曾经就是用类型装换运算符重载解决一个跨平台通信的问题。谢谢阅读2、bool运算符重载intfloatboolbool谢谢阅读重载运算符bool时候,需要注意有很多麻烦和臆想不到的东西精品文档放心下载template<classT>classtestbool{……operatorbool()constthrow()谢谢阅读{returnm_pT!=0;}private:T*m_pT;}下面结果均通过编译testbool<int>sp1;testbool<std::string>sp2;感谢阅读if(sp1==sp2)if(sp1!=sp2)boolb=sp1intI=sp1*10;从上面可以看得出bool的表现已经远远超过bool本身了,所以建议大家不谢谢阅读要轻易对bool进行重载操作。3、地址运算符重载在DCOM应用中,我们有一个重载运算符的例子:STDAPICoCreateInstance(REFCLSIDrclsid,LPUNKNOWNpUnkOuter,DWORDdwClsContext,REFIIDriid,LPVOID*ppv);我们看最后一个参数LPVOID指针的指针,这里是一个输出参数,返回感谢阅读一个接口的指针。一般情况下我们应用如下IUnknown*pUn;CoCreateInstance(…,…,…,…,(void**)&pUn);(5)精品文档放心下载然而我们也可以这样写:IUnknown*pUn;CComPtrcomPtr(pUn);CoCreateInstance(…,…,…,…,(void**)&comPtr);(6)感谢阅读之所以能够这么写这是因为CComPtr重载了“&”运算符,如下:谢谢阅读template<classT>classCComPtr{public:…CComPtr(T*lp){if((p=lp)!=NULL)p->AddRef();}…T**operator&(){ATLASSERT(p==NULL);return&p;}private:T*p;};&comPtr实际上是得到了pUn(5)式和(6式其实传入的感谢阅读参数是一样当都是传入了pUn的地址。感谢阅读作,这是因为:A、暴露了封装对象的地址,如上面CComPtr对pUn的封装其实不谢谢阅读起任何作用,任何时候我都可以直接访问和修改pUn指针,这就意味着感谢阅读所有权的完全丧失,封装不起任何意义B、对于unaryoperator&的重载使得重载对方永远无法与STL容器谢谢阅读进行任何融合,甚至无法参与任何泛型编程。一个对象的地址是一个对象最基本的概念,在一般情况下,我们并不提倡,精品文档放心下载也请大家慎用地址运算符的重载。4、指针运算符重载指针运算符,有一个及其特殊且及其重要的机制:当你对某个型别实施operator-〉而这个型别并非原生指针时候:精品文档放心下载编译器会从这个型别中找出用户自定义的operator-精品文档放心下载续对这个operator-〉返回的结果实施operator-〉直到找到一个原生指针。精品文档放心下载这种机制导致了一个特有的技术:(preandpostfunctioncalls),谢谢阅读“前调用”及后调用技术。应用如下:classCallDoSomething{public:voidDoCall(){TRACE("DoCall\n");}};template<classT>classCallInMutiThread{classLockProxy{public:LockProxy(T*pT):m_pT(pT){TRACE("Lock\n");}~LockProxy(){TRACE("UnLock\n");}T*operator->(){returnm_pT;}private:T*m_pT;};public:CallInMutiThread(T*pT):m_pT(pT){
}LockProxyoperator->(){returnLockProxy(m_pT);}private:T*m_pT;};上面CallDoSomething是函数调用,假设这个类原来是在单线程中运行的,但精品文档放心下载是现在已经移植到了多环境中,所以我们就增加了CallInMutiThread对原始谢谢阅读类进行配接使之适应与多线程环境,调用过程如下:CallDoSomethingDoSomthing;感谢阅读CallInMutiThread<CallDoSomething>MutiThread(&DoSomthing);感谢阅读MutiThread->DoCall();调用结果如下:LockDoCallUnLock从上面可以看出在调用CallDoSomething的成员函数DoCall之前调用精品文档放心下载了Lock方法,在调用结束后有调用了UnLock。这就是所谓的“前调用”和“后感谢阅读调用精品文档放心下载调用”模式均可由此解。重载“-〉”运算符,同时引出了智能指针的概念,参见下页。谢谢阅读5、括号运算符重载语法特征:primary-expression(expression-listopt)精品文档放心下载括号运算符是一个同“-〉”运算符一样也是一个及其重要的运算符谢谢阅读在MSDN上说括号运算符是一个二元运算符,我觉得这个说法是完全错误的,在感谢阅读所有C++运算符重载中,括号运算符,应该是唯一没有规定参数元的个数的。它谢谢阅读的参数可以从0个到N个。示例:classPoint{public:Point(){_x=_y=0;}Point&operator()(intdx,intdy)感谢阅读{_x+=dx;_y+=dy;return*this;}感谢阅读private:int_x,_y;};调用如下:Pointpt;pt(3,2);从上面可以看出,括号运算符,调用形式如下:object(parameterlist);看起来和函数的形式是完全一样的:function(parameterlist);所以根据这一特点我们称之为仿函数。第三章模板学习要求:1、了解什么是模板2、学会运用模板函数,模版类和STLtemplatesC++中最感谢阅读活跃的一项编程技术,模版的第一个革命性的应用就是StandardTemplateLibrary谢谢阅读(简称STL)。STL将templates技术广泛应用于STL容器和STL算法上,在这一领域精品文档放心下载template技术发挥到了极致。本章介绍C++templates的基本概念和语言特性谢谢阅读1.1认识模板1、模板的基本语法是:template<[typelist][,[arglist]]>declaration谢谢阅读这个template感谢阅读函数),这个模板参数列表是用逗号分隔的类型列表(在这个表单忠使用class或者精品文档放心下载是typename精品文档放心下载据类型。declaration域必须是一个函数或者类的声明。感谢阅读1.4模板函数语法定义:template<comma-separated-list-of-parameters>谢谢阅读function-name(parameterlist)精品文档放心下载{}例如:template<typenameT>inlineTconst&max(Tconst&a,Tconst&b)谢谢阅读{//ifa<bthenusebelseusea谢谢阅读returna<b?b:a;}调用形式:1:通过调用的参数来识别模板的各参数类型MAX(4,4.2);//OK,buttypeoffirstargument谢谢阅读definesreturntype2:明确指定参数的类型:MAX<int,float>(4,4.2);//OK精品文档放心下载在我们的例子中这个参数列表是typenameT,其实在这里typename是可以用感谢阅读class替换的,typename是在C++class是一个历史性的概谢谢阅读念,typename表达了一个比class更抽象意义上的概念。感谢阅读有如下定义如:classtypenamedef{typedefintINT_TYPE;};如果这样表达是正确的:template<classT>classtesttypename:publictypenamedef感谢阅读{public:typenameT::INT_TYPE;INT_TYPEm_int;};但是如果把此处的typename换成class就会报错谢谢阅读1.4.1重载模板函数(OverloadingFunctionTemplates)谢谢阅读谢谢阅读具有不同的函数定义,在调用的时候再由C++编译器决定,那一个候选函数更有资格被谢谢阅读匹配调用。下面这个简单的例子说明了重载模板函数的方法和过程://maximumoftwointvalues谢谢阅读inlineintconst&max(intconst&a,intconst&b)感谢阅读{}returna<b?b:a;//maximumoftwovaluesofanytype精品文档放心下载template<typenameT>inlineTconst&max(Tconst&a,Tconst&b)精品文档放心下载{returna<b?b:a;}//maximumofthreevaluesofanytype谢谢阅读template<typenameT>inlineTconst&max(Tconst&a,Tconst&b,Tconst&c)感谢阅读{returnmax(max(a,b),c);}intmain(){::max(7,42,68);//callsthetemplateforthreearguments精品文档放心下载::max(7.0,42.0);//callsmax<double>(byargument谢谢阅读deduction)::max('a','b');//callsmax<char>(byargumentdeduction)精品文档放心下载::max(7,42);//callsthenontemplatefortwoints感谢阅读::max<>(7,42);//callsmax<int>(byargumentdeduction)谢谢阅读::max<double>(7,42);//callsmax<double>(noargument感谢阅读deduction)}精品文档放心下载初始化为同一类型,如:max(7,42)调用匹配非模板函数也匹配模板函数。1.5模板类基本的语法定义:template<comma-separated-list-of-parameters>精品文档放心下载classclass-name{……};具有缺省参数的模板定义形式template<typenameT,typenameAlloc=alloc>感谢阅读classclass-name{……};精品文档放心下载设计的思维方法:申明并不一定需要定义:1、申明一个函数,并不实现在C++中我们可能因为禁止某个缺省函数的调用操作而申明该缺省函数,但感谢阅读不定以它,例如:classtestDeclare{public:testDeclare();};我们对上面的testDeclare的缺省构造函数进行了声明,但是我们并没精品文档放心下载有构造函数的的定义,当我们执行testDeclaredeclare;上面这个申请创建一个对象的操作会被编译系统所禁止当然,我们也可以对缺省的重载运算符实施同样的手段2、申明一个函数而不实现可能是为了模板函数的泛化泛化:template<typenameT>TtestFun();特化:template<>inttestFun(){return10;}3、申明一个函数可能仅仅为了获得特殊某一项功能例如:TMarkT();charTest(T);intTest(...);sizeof(MarkT());上面的例子其实就是求T类的的字节数,其实在一般情况下,我们直接写精品文档放心下载sizeof(T)谢谢阅读可以通过上面的例子MarkT()函数,其实上面的MarkT(),charTest(T)精品文档放心下载函数intTest(...)都是没有定义的,但是由于sizeof是编译时刻的精品文档放心下载运算,所以它并不需要关心这些函数是否实现。•申明一个类而不实现例如我们在禁止模板类的泛化过程中就可以实现template<typenameT>classtestClass;//泛化只申明template<>classtestClass<int>//特化进行实现精品文档放心下载{};如果我们有testClass<char>test;//error精品文档放心下载//系统会调用泛化时发现没有没有实现二产生编译错误testClass<int>test;//OK//系统调用特化故OK1.5.1模板设计基本方法A、编译器断言template<classT,classU>{typedefcharsmall;classbig{chardummy[2]};谢谢阅读staticsmalltest(U);staticbigtest(…);staticTmarkT();//函数定义只是为了得到一个返回类型精品文档放心下载public;enum{value=sizeof(test(makT()))==sizeof(Small)};精品文档放心下载};B、模板特化template<typenameI,typenameO>精品文档放心下载structtestClass{testClass(){count<<"I,O"<<endl;}谢谢阅读};template<typenameT>structtestClass<T*,T*>{testClass(){count<<"T*,T*"<<endl;}感谢阅读};C、常数映射型别template<intv>structtestClass{enum{value=v};};D、型别映射型别template<typenameT>structtestClass{typedefTOriginalType;};1.6STL标准模板库容器•序列容器–vector,list、deque、stack(没有迭代器)、queue(没有迭代器)、即
stack、queue不允许遍历行为精品文档放心下载•关联容器–set(标准)、map(标准)、hash_table、RB-tree精品文档放心下载•通用算法•begin()、end()、size()、empty()、erase(iterator__position)、clear()迭代器谢谢阅读迭代器的基本算法•能够进行+、-、++、--、+=、-=、==、!=等运算谢谢阅读•是一种智能性指针,实现operator*operator->的重载感谢阅读•根据迭代器的特点,迭代器又称循环子
迭代器前闭后开区间[first,last)感谢阅读型别•单向迭代器•可逆迭代器•随机迭代器•迭代器的继承关系型别萃取–value_type–difference_type–refrence_type–pointer_type–iterator_category–型别萃取机–iterator_traits算法•数值运算–power、itoa、accu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 委托设计制作印刷合同书
- 广告媒体发布协议合同
- 淮南装配式民宿施工方案
- 2024-2025学年下学期高中英语选修一第四单元B卷
- 公路边坡支护专项施工方案
- 数学逻辑能力强化题集及答案解析
- 大一班期末数学试卷
- 2025年万科消防测试题及答案
- 2025年涉外法律面试题及答案
- 2025年初级职业技能试题及答案
- 耳鼻咽喉头颈外科学耳鼻咽喉应用解剖
- 最新人音版音乐二年级下册全册教案
- 航空航天概论(课堂PPT)
- 新改版教科版六年级下册科学全册知识点归纳 (超全)
- 英语的起源与发展(课堂PPT)
- 药物化学结构式大全(高清版)
- 二房东租房合同范文
- 影视旅游作品对游客出游动机及行为意向的影响研究
- 物业工程人员入户维修流程
- 【图文】煤矿井下常见的失爆现象
- 我的寒假生活模板
评论
0/150
提交评论