版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、附件三:教材模模板说明:一、为便便于保存存和管理理,各类类培训教教材均采采用合订订本。二、教材材结构:各类培训训教材由由教材封封面、前前言、课课程目录录、单门门课程教教材和封封底五部部分构成成。三、教材材封面:1、封面面颜色:教材封封面为彩彩色,工工作基本本常识教教材为深深蓝色,技技术基础础知识教教材为草草绿色,管管理基础础知识教教材为浅浅蓝色,营营销基础础知识教教材为墨墨绿色。2、教材材名称:采用“工作基基本常识识”“技术术基础知知识”“管理理基础知知识”“营销销基础知知识”,字体体为隶书书,黑体体,600号。3、其他他标识:员工培培训中心心编辑采采用宋体体、黑体体、三号号,位于于教材名名称
2、下面面;华为为技术有有限公司司采用宋宋体、黑黑体、小小二,位位于底端端;华为为标识位位于华为为技术有有限公司司和员工工培训中中心编辑辑之间;右上角角为保密密标识,楷楷体,黑黑体,四四号。四、教材材封底:教材封底底包括教教材名称称、华为为技术有有限公司司员工培培训中心心和时间间、版本本号,位位于页面面的右下下角。五、前言言:教材前言言为各类类培训的的目的、课程门门类、特特点、主主要内容容的简介介。六、课程程目录:为各门课课程排列列顺序的的目录,统统一编排排页码,便便于学员员查找。七、单门门课程教教材:各单门课课程教材材由课程程封面、章节目目录、章章节内容容、学习习要求、思考题题、参考考资料和和相
3、关网网站组成成。1、课程程封面:课程封面面为彩色色,课程程名称为为隶书、60号号、黑体体、黑色色,左上上角为课课程编码码。2、章节节目录:为宋体、小四、黑色3、章节节内容:(1)标标题:章章节目分分别以“第一章章、第二二章、第第三章”“1.1、11.2、1.33”和“(1)(22)(33)”来表示示。章为为宋体、小二、黑体,节节为宋体体、四号号、黑体体,目为为宋体、小四、黑体。 (2)文文字:每每四个小小时的培培训课程程,字数数控制在在1000002000000字之间间。教材材文字一一般为宋宋体、小小四、黑黑色,行行间距为为一行半半。(3)内内容:章章节内容容要有完完整的理理论体系系,不能能成
4、为授授课胶片片的翻版版。4、学习习要求:每章标题题下面为为本章的的学习要要求,以以明确本本章要掌掌握的要要点。文文字为楷楷体、小小四。5、思考考题:每章最后后要有思思考题,以以便帮助助学员复复习、思思考。6、参考考资料和和相关网网站:有参考资资料和相相关网站站的要附附在课程程后面,以以便帮助助学员查查阅。 内部部资料,注注意保密密C+中中级培训训教程员工培训训中心 编辑20055年6月月V1.0华为技术术有限公公司前 言 C+语言言中级教教材讲授授C+语言的的运用技技术,包包括:类类、对象象之间的的关系、对象的的存储与与布局、运算符符重载、智能指指针、仿仿函数、泛型编编程,CC+模模式设计计基
5、本思思想。NE00020009cVV1.001业务与软软件C+语言言项目C+进进阶目 录录第一章类类、接口口 71.1 Hanndlee-Boody与与接口、抽象接接口771.2 多继承承、与菱菱形缺陷陷、thhis跳跳转等 131.3 C+多态的的两种多多态形式式和区别别 18第二章重重载1882.1 函数重重载192.2 运运算符重重载220 第三章模模板2993.1 模块函函数 293.2 模模块类3113.3 SSTL标标准模板板库334附录:参参考资料料 399前言我们在CC+基基础课程程中已经经了解了了C+的一些些基本概概念,知知道了什什么是类类什么是是对象。也了解解了继承承、封装
6、装、多态态等C+面向向对象的的基本特特征,本本课程主主要是更更进一步步探讨一一下C+一些些基本模模型的应应用,加加深对概概念的理理解,由由于课程程时间有有限,CC+,模模型和内内容又如如此之多多,对任任何一个个模型都都无法深深入进去去,所以以只能泛泛泛而谈谈。第一章类类、接口口学习要求求: 1、了了解类的的继承、封装等等概念之之间的关关系2、了解解什么是是接口,什什么是虚虚函数,它它有什么么样的特特点。学学会使用用接口编编程的思思想本章节主主要介绍绍C+中的类类、接口口。类,包包涵了一一组数据据和一组组基于数数据上的的一组方方法。它它描述了了一个对对象的属属性、状状态和行行为;接接口,它它只是
7、描描述了一一个对象象的简单单的行为为。有关类的的基本概概念:Cllasss naamess CClasss mmembberssMeembeer FFuncctioonsSttatiic MMembber FunnctiionssUnnionnsC+ BBit FieeldssNeesteed CClasss DDecllaraatioonsTyype Nammes in Claass ScoopeMuultiiplee Baase ClaasseesViirtuual FunnctiionssAbbstrractt CllasssesCoontrrolllingg Acccesss tto
8、CClasss MMembberssprivvatee Meembeersprootecctedd Meembeerspubblicc MeembeersAcccesss Sppeciifieers forr Baase Claassees,priiavtte,pubblicc、prooteccteddFriiendds CConsstruuctoorsDeestrructtorssCoonveersiion Funnctiionssthhe nnew opeerattor andd thhe ddeleete opeerattorCoopyiing Coonsttrucctorr FFunc
9、ctioonsInnterrfacceHanddle-Boddy与接接口、抽抽象接口口在C+中封装装的概念念是把一一个对象象的外观观接口同同实际工工作方式式(实现现)分离离开来,但但是C+的封封装是不不完全的的,编译译器必须须知道一一个对象象的所有有部分的的声明,以以便创建建和管理理它。我我们可以以想象一一种只需需声明一一个对象象的公共共接口部部分的编编程语言言,而将将私有的的实现部部分隐藏藏起来。C + +在在编译期期间要尽尽可能多多地做静静态类型型检查。这意味味着尽早早捕获错错误,也也意味着着程序具具有更高高的效率率。然而而这对私私有的实实现部分分来说带带来两个个影响:一是即即使程序序员不
10、能能轻易地地访问实实现部分分,但他他可以看看到它;二是造造成一些些不必要要的重复复编译。然而C+并没没有将这这个原则则应用到到二进制制层次上上,这是是因为CC+的的类既是是描述了了一个接接口同时时也描述述了实现现的过程程,示例如如下:claass CMyyStrringgpriivatte:connst intt m_cchh;chhar *m_pszz;pubblicc:CMMySttrinng(cconsst ccharr *ppsz);CCMySStriing();innt LLenggth() cconsst;innt IIndeex(cconsst ccharr *ppsz) coo
11、nstt;CMySStirrng对对外过多多的暴露露了内存存布局实实现的细细节,这这些信息息过度的的依赖于于这些成成员变量量的大小小和顺序序,从而而导致了了客户过过度依赖赖于可执执行代码码之间的的二进制制耦合关关系,这这样的接接口不利利于跨语语言跨平平台的软软件开发发和移植植。Handdle-Boddy模式式解决这个个问题的的技术有有时叫句句柄类( hanndlee cllassses)或或叫“Cheeshiire Catt” 11 。有关实实现的任任何东西西都消失失了,只只剩一个个单一的的指针“m_ppThiis”。该指指针指向向一个结结构,该该结构的的定义与与其所有有的成员员函数的的定义一
12、一样出现现在实现现文件中中。这样样,只要要接口部部分不改改变,头头文件就就不需变变动。而而实现部部分可以以按需要要任意更更动,完完成后只只要对实实现文件件进行重重新编译译,然后后再连接接到华为为项目中中。这里有有这项技技术的简简单例子子。头文文件中只只包含公公共的接接口和一一个简单单的没有有完全指指定的类类指针。classs CCMySStriingHHanddlepriivatte:classsCMMySttrinng;CMySStriing *m_pThhis;pubblicc:CMMySttrinngHaandlle (connst chaar *pszz); CMyyStrringgH
13、anndlee ();innt LLenggth() cconsst;innt IIndeex(cconsst ccharr *ppsz) coonstt;;CMyyStrringgHanndlee: CMyyStrringgHanndlee(coonstt chhar *pssz):m_pThhis(neww CMMySttrinng(ppsz);CMyyStrringgHanndlee: CMMySttrinngHaandlle() ddeleete m_ppThiis;intt CMMySttrinngHaandlle:Lenngthh()reeturrn mm_pTThiss-LLen
14、ggth();intt CMMySttrinngHaandlle:Inddex(connst chaar *pszz) reeturrn mm_pTThiss-IIndeex(ppsz);这是所所有客户户程序员员都能看看到的。这行claassCCMySStriing;是一个没没有完全全指定的的类型说说明或类类声明(一一个类的的定义包包含类的的主体)。它告诉诉编译器器,chheshhiree 是一一个结构构的名字字,但没没有提供供有关该该结构的的任何东东西。这这对产生生一个指指向结构构的指针针来说已已经足够够了。但但我们在在提供一一个结构构的主体体部分之之前不能能创建一一个对象象。在这这种技术术
15、里,包包含具体体实现的的结构主主体被隐隐藏在实实现文件件中。在设计模模式中,这这就叫做做Hanndlee-Boody 模式,HHanddle-Boddy只含含有一个个实体指指针,服服务的数数据成员员永远被被封闭在在服务系系统中。Handdle-Boddy模式式如下:classHandlem_pThisclassHanddle-Boddy模式式(句柄柄类做为为接口)Handdle-Boddy的布布局结构构永远不不会随着着实现类类数据成成员的加加入或者者删除或或者修改改而导致致Hanndlee-Boody的的修改,即即Hanndlee-Boody协协议不依依赖于CC+实实现类的的任何细细节。这这就
16、有效效的对用用户的编编译器隐隐藏了这这些斜街街,用户户在使用用对这项项技术时时候,HHanddle-Boddy 接接口成了了它唯一一的入口口。然而Haandlle-BBodyy模式也也有自己己的弱点点:接口类必必须把每每一个方方法调用用显示的的传递给给实现类类,这在在一个只只有一个个构造和和一个析析构的类类来说显显然不构构成负担担,但是是如果一一个庞大大的类库库,它有有上百上上千个方方法时候候,光是是编写这这些方法法传递就就有可能能非常冗冗长,这这也增加加了出错错的可能能性。对于关注注于性能能的应用用每一个个方法都都得有两两层的函函数调用用,嵌套套的开销销也不理理想由于句柄柄的存在在依然存存在
17、编译译连接器器兼容性性问题。接口和实实现分离离的Haandlle-BBodyy。抽象接口口使用了“接口与与实现的的分离”技术的的Hanndlee-Boody 解决了了编译器器/链接器器的大部部分问题题,而CC+面面向对象象编程中中的抽象象接口同同样是运运用了“接口与与实现分分离”的思想想,而采采用抽象象接口对对于解决决这类问问题是一一个极其其完美的的解决方方案。抽象接口口的语言言描述:classs IIMySStriingviirtuual intt Leengtth() coonstt = 0; /这表示示是一个个纯虚函函数,具具有纯虚虚函数的的接口viirtuual intt Inndex
18、x(coonstt chhar *pssz) connst = 00;;抽象接口口的内存存结构: classvtprclass:m1class:m2抽象接口口的内存存布局抽象接口口的实现现代码:接口:classs IIMySStriingvvirttuall innt LLenggth() cconsst = 0; /这表表示是一一个纯虚虚函数,具具有纯虚虚 /函数数的接口口vvirttuall innt IIndeex(cconsst ccharr *ppsz) coonstt = 0;;实现:cllasss CMMySttrinng:pubblicc IMMySttrinngpriivat
19、te:connst intt m_cchh;chhar *m_pszz;pubblicc:CMMySttrinng(cconsst ccharr *ppsz);viirtuual CMMySttrinng();innt LLenggth() cconsst;innt IIndeex(cconsst ccharr *ppsz) coonstt;从上面采采用抽象象接口的的实例来来看,抽抽象接口口解决了了Hanndlee-Boody所所遗留下下来的全全部缺陷陷。抽象接口口的一个个典型应应用:抽象工厂厂(AbbstrracttFacctrooy)抽象工厂厂模式多继承与与菱形缺缺陷、tthiss跳转等等
20、多重继承承是C+语言言独有的的继承方方式,其其它几乎乎所有语语言都秉秉承了单单一继承承的思想想。这是是因为多多重继承承致命的的缺陷导导致的:菱形缺陷陷当继承基基类时,在在派生类类中就获获得了基基类所有有的数据据成员副副本。假假如类BB 从AA1和AA2两个个类多重重继承而而来,这这样B类类就包含含A1、A2类类的数据据成员副副本。考虑如如果A11、A22都从某某基类派派生,该该基类称称为Baase,现现在继承承关系如如下:菱形继承承关系我们C+语言言来描述述这种继继承关系系:classs BBasee ;classs AA1 :pubblicc Baase ;classs AA2 :pubbl
21、icc Baase ;classs BB :ppubllic A1,pubblicc A22 ;那么A11、A22都具有有Basse的副副本。这这样B就就包含了了Basse的两两个副本本,副本本发生了了重叠,不不但增加加了存储储空间,同同时也引引入了二二义性。这就是是菱形缺缺陷,菱菱形缺陷陷时间是是两个缺缺陷:子对象重重叠向上映射射的二义义性。菱形缺陷陷的其中中一种解解决办法法将在C+世界里里最广泛泛的使用用虚拟继继承解决决菱形缺缺陷的应应用便是是标准CC+的的输入/输出iiosttreaam;标准C+的输输入/输出多重接口口与方法法名冲突突问题(Siamese twins)对继承而而来的虚虚
22、函数改改写很容容易,但但是如果果是在改改写一个个“在两个个基类都都有相同同原型”的虚函函数情况况就不那那么容易易了。提出问题题:假设汽车车最大速速度的接接口为IICarr,潜艇艇最大速速度的接接口为 IBooat,有有一个两两栖类的的交通工工具它可可以奔跑跑在马路路上,也也可以航航行在大大海中,那那么它就就同时拥拥有ICCar、IBooat两两种交通通工具的的最大速速度特性性,我们们定义它它的接口口为ICCarBBoatt;claass ICCar vvirttuall innt GGetMMaxSSpeeed()= 0;claass IBBoatt viirtuual intt GeetMa
23、axSppeedd()= 0;我们先对对ICaarBooat的的接口做做一个尝尝试:claass CCaarBooatviirtuual intt GeetMaaxSppeedd();/既完完成ICCar的的GettMaxxSpeeed()接接口方法法又/完成成IBooat的的接口方方法?显显然不能能够;解决问题题:显然上面面这个尝尝试根本本就无法法成功,只只用一个个实现方方法,怎怎么能够够求出这这个ICCarBBoatt交通工工具奔跑跑在马路路上的最最高时速速,同时时也能够够求出航航行在大大海上的的最大航航行速度度呢。上面这一一问题矛矛盾就在在一一个个方法,却却需要两两个答案案。看来来ICa
24、arBooat要要返回两两个答案案就必须须有两个个方法了了,我们们假设一一个方法法是求在在陆地上上奔跑的的速度,名名称为GGetCCarMMaxSSpeeed();另一个个方法是是求在大大海上航航行的最最大速度度,名称称为GeetBooatMMaxSSpeeed();那这两两个方法法又怎么么和GeetMaaxSppeedd()接接口方法法联系起起来呢;幸运的是是,我们们找到了了解决办办法,而而且解决决办法有有很多种种,下面面介绍一一下继承承法。claass IXCCar :puubliic IICarr vvirttuall innt GGetMMaxSSpeeed()GGetCCarMMax
25、SSpeeed();viirtuual intt GeetCaarMaaxSppeedd() = 0;;claass IXBBoatt:puubliic IIBoaatviirtuual intt GeetMaaxSppeedd()GGetBBoattMaxxSpeeed();viirtuual intt GeetBooatMMaxSSpeeed() = 0;;claassCCCarrBoaat: pubblicc IXXCarr , pubblicc IXXBoaatviirtuual intt GeetCaarMaaxSppeedd() viirtuual intt GeetBooatMM
26、axSSpeeed() ;多重接口口与方法法名冲突突问题thiss跳转thiss跳转是是指的“对象同同一性”问题。在单一一继承的的世界内内,无论论继承关关系怎么么复杂,针针对于同同一对象象,无论论它的子子类或者者父类的的thiis指针针永远相相等。即即如果有有下面的的模型:B从A继继承的关关系图那么 对于一一个已经经实例化化B类的的对象 bObbjecct,永永远有(BB*)&bObbjecct =(AA*)&bObbjecct 成成立。但是在在多继承承的世界界内,上上面的等等式就不不能恒成成立,对对象的同同一性受受到了挑挑战。特别的的是,在在多继承承世界内内如果图图四的菱菱形关系系存在情情况
27、下,如如果对于于已经实实例化BB类的对对象bOObjeect; (BBasee*)(AA1*)&bObbjecct != (BBasee*)(AA2*)&bObbjecct 成成立,当当这种事事情发生生的时候候我们就就只能特特殊处理理了。这这种情况况在COOM应用用中处处处都会发发生。C+多多态的两两种多态态形式和和区别C+有有两种多多态多态态形式:编译时刻刻多态,编编译时刻刻多态依依靠函数数重载或或者模板板实现运行时刻刻多态。运行时时刻多态态依靠需需函数虚虚接口实实现第二章重重载学习要求求:11、了解解什么是是函数重重载,什什么是运运算符重重载 2、学会会运用智智能指针针,仿函函数在C+的世
28、界界里,有有两种重重载:函函数重载载和运算算符重载载,函数数重载就就采用采采用参数数匹配的的原则,进进行重载载的,它它是一种种编译时时刻的多多态。而而运算符符重载,使使采用改改写或者者说重新新定义CC+的的内嵌运运算符的的方法。有关重载载的基本本概念:Oveerlooadeed FFuncctioonsOverrloaadedd OpperaatorrsDecclarratiion MattchiingArggumeent MattchiingArggumeent Typpes MattchiingArggumeent Couuntss MaatchhinggC+ Unnaryy Oppera
29、atorrsBinnaryy OpperaatorrsSmaart PoiinteerFunnctiion objjectts函数重载载函数重重载方法法是在当当前范围围内选择择一个最最佳匹配配的函数数声明供供调用该该方法者者使用。如果一一个适合合的函数数被找到到后,这这个函数数将会被被调用,在在这里“适合的的”是指按按下列顺顺序匹配配的符合合下面条条件的:一个精确确匹配的的函数被被找到一个参数数只有细细微的差差别,几几乎可以以忽略不不计的。象类似通通过子类类向父类类转化达达到参数数匹配的的通过正常常转化函函数进行行类型转转换,能能够达到到参数匹匹配到的的。通过用户户自定义义的转化化函数(如如转
30、化运运算符或或者构造造函数)达达到参数数匹配的的参数是采采用省略略符号函数重重载的方方法基本本上有:根据函数数参数数数据类型型的不同同进行的的重载;根据参数数个数的的不同进进行的重重载;缺省参数数上的重重载我们在在这里把把缺省参参数也称称为一种种函数重重载,实实际上它它并不是是严格意意义上的的重载。在使用用缺省参参数时必必须记住住两条规规则。第第一,只只有参数数列表的的后部参参数才可可是缺省省的,也也就是说说,我们们不可以以在一个个缺省参参数后面面又跟一一个非缺缺省的参参数。第第二,一一旦我们们开始使使用缺省省参数,那那么这个个参数后后面的所所有参数数都必须须是缺省省的。第第三,缺缺省参数数只
31、能放放在函数数声明中中。第四四,缺省省参数可可以让声声明的参参数没有有标识符符。返回值重重载特别别注意,在在C+中并没没有根据据返回返返回值的的不同进进行重载载的,即即我们不不能定义义这样的的函数:voiid ff();intt f();在C+中这这样的函函数声明明方法是是被禁止止的,但但是我们们有时间间可能又又需要这这样的重重载方法法,我们们又怎么么实现呢呢,其实实很简单单,jiiangg函数的的参数进进行扩展展,将这这个函数数返回值值的数据据类型,做做为扩展展参数的的数据类类型来。如下:voiid ff(vooid);voiid ff(innt);此时这这个例子子中的参参数列表表的数据据,
32、只在在编译时时刻起到到分练函函数的作作用,在在运行时时刻并不不起到传传值作用用,模板板中经常常都应用用到了这这种方法法。运算符重重载你可以重重新定义义C+绝大多多数内嵌嵌运算符符的实现现方法和和功能,这这些重定定义的或或者说重重载的运运算符,有有可能全全局作用用的,也也有可能能作用在在类基础础之上的的,运算算符重载载的实现现可能以以类的成成员函数数的形式式出现,也也有可能能以全局局性的函函数的身身份出现现。在C+中重重载运算算符的名名字为ooperratoorx, 在在这里 x 是是一个可可重载的的运算符符,如:重载加加法运算算符,你你需要定定义一个个名为 opeerattor+ 的函函数,然
33、然后实现现他,其其它的类类似定义义就可以以了,例例如:Claass commpleex/vveryy siimpllifiied commpleexdooublleree,imm;pubblicc:coompllex(douubleer,ddoubbleii):rre(rr),iim(ii);coompllex opeerattor+(coompllex);coompllex opeerattor*(coompllex);定义了了commpleex 这这个复数数的一个个简单的的实现概概念模型型。一个个复数是是由一对对douublee类型的的数据组组成,并并定义了了这个复复数的两两个方法法,加法
34、法运算 commpleex:opeerarrtorr+()和和乘法运运算 ccompplexx:ooperratoor*().现在我我们就能能够实现现下面的的复数表表达式了了:voiid ff()coompllex a = coompllex(1 , 3.1);coompllex b = coompllex(1.22 , 2);coompllex c = b;a = bb + c;b = bb + c * a;c= a * bb + commpleex(11 , 2);C+可可重载的的和C+不可可重载的的运算符符可重载运运算符表表:OperratoorNameeTypeeOperratoorN
35、ameeTypee,CommmaBinaary*Poinnterr-too-meembeer sseleectiionBinaary!Logiicall NOOTUnarry/DiviisioonBinaary!=IneqquallityyBinaary/=Diviisioon/aassiignmmenttBinaary%ModuulussBinaaryLesss thhanBinaary%=Moduuluss/asssiggnmeentBinaaryLeftt shhifttBinaary&Bitwwisee ANNDBinaary=Leftt shhiftt/asssiggnmeentBi
36、naary&Addrresss-offUnarryGreaaterr thhanBinaary*MulttipllicaatioonBinaary=Greaaterr thhan or equual toBinaary*Poinnterr deereffereenceeUnarryRighht sshifftBinaary*=Multtipllicaatioon/aassiignBinaary=Righht sshifft/aassiignmmenttBinaary+AddiitioonBinaary Arraay ssubsscriipt+Unarry PPlussUnarryExcllus
37、iive ORBinaary+Incrremeent11Unarry=Excllusiive OR/asssignnmenntBinaary+=Addiitioon/aassiignmmenttBinaary|Bitwwisee inncluusivve OORBinaarySubttracctioonBinaary|=Bitwwisee inncluusivve OOR/aassiignmmenttBinaaryUnarry nnegaatioonUnarry|Logiicall ORRBinaaryDecrremeent11UnarryOnes ccompplemmenttUnarry=S
38、ubttracctioon/aassiignBinaarydeleetedeleeteMembber sellecttionnBinaarynew不可重载载运算符符表:OperratoorNamee.Membber sellecttionn.*Poinnterr-too-meembeer sseleectiion:Scoppe rresooluttionn? :Condditiionaal#Prepproccesssor symmboll#Prepproccesssor symmboll 在上上面可重重载的运运算符可可以看出出运算符符重载共共分为两两类:一一元运算算符重载载和二元元运算符符重载
39、一元运运算符重重载:在声声明一个个类的非非静态的的一元运运算符重重载函数数时,你你必须声声明的形形式如下:ret-typpeopperaatorrop() (1)在这这里reet-ttypee 是指指返回数数据类型型 opp 是指指一元运运算符在声声明一个个全局的的一元运运算符重重载函数数时,你你必须声声明的形形式日下下:ret-typpeopperaatorrop(argg)(2)在这这里 rret-typpe 与与 opp 和上上面的意意思一样样,arrg 是是指这个个运算符符所作用用的数数据类型型二元运运算符重重载:在声明一一个类的的非静态态的二元元运算符符重载函函数时,你你必须声声明的
40、形形式如下:ret-typpeopperaatorrop(arg)(3)(3)式式和二式式基本相相同 aarg 可以是是任何一一个在声声明一个个全局的的二元运运算符重重载函数数时,你你必须声声明的形形式日下下:ret-typpeopperaatorrop(argg1,argg2)(4)在这这里 rret-typpe 与与 opp 和上上面的意意思一样样,arrg1,aarg22, 是是指这个个运算符所作作用两个个数据类类型几类特殊殊的运算算符重载载类型转换换运算符符所有有的数据据类型均均可以定定义构造造函数,包包括系统统定义的的数据类类型和用用户自定定义的数数据类型型,如:claass CSt
41、trinngoperratoorLPPCSTTR() coonstt; ;应用:CSttrinng sstr = “123345”;LPCCSTRR lppsz = sstr;/此此处会进进行LPPCSTTR运算算 这这只是一一个简单单的应用用的示例例,其实实有时间间类型转转换具有有无比强强大的功功能。我我曾经就就是用类类型装换换运算符符重载解解决一个个跨平台台通信的的问题。booll运算符符重载intt、flloatt、boool等等运算符符也是可可以重载载的,例例如重载载boool运算算符,但但是重载载运算符符boool 时时候,需需要注意意有很多多麻烦和和臆想不不到的东东西temppla
42、tteclasss ttesttboooloperratoorboool() cconsstthhroww() retuurnmm_ ppT != 00; privvatee:T *m_ppT;下面结果果均通过过编译testtboool spp1;testtboool sp22;if(ssp1 = sp22)if (sp11 != spp2) boool bb = sp11 intt I = ssp1 * 110; 从上面面可以看看得出 boool 的的表现已已经远远远超过 boool 本本身了,所所以建议议大家不不要轻易易对 bbooll 进行行重载操操作。地址运算算符重载载在DCCOM应应
43、用中,我我们有一一个重载载运算符符的例子子:STDAAPICCoCrreatteInnstaancee(RREFCCLSIIDrcclsiid,LLPUNNKNOOWNppUnkkOutter,DDWORRDdwwClssConntexxt,RREFIIIDrriidd,LLPVOOID*ppvv);我们看最最后一个个参数 LPVVOIDD 指针针的指针针,这里里是一个个输出参参数,返返回一个个接口的的指针。一般情况况下我们们应用如如下IUUnknnownn *ppUn;CooCreeateeInsstannce(,(voiid *)& pUUn); (5)然而我们们也可以以这样写写:IUUn
44、knnownn *ppUn;CCComPPtr commPtrr(pUUn);CooCreeateeInsstannce(,(voiid *)& coomPttr); (6)之所以能能够这么么写这是是因为CCCommPtrr 重载载了“&”运算符符,如下下:tempplatte cllasssCCoomPttrpuubliic:CCommPtrr(T* lpp)if (p = lp) != NULLL)p-AAddRRef();T* opeerattor&()ATLAASSEERT(p=NUULL);retuurn &p;prrivaate:T* pp;&coomPttr 实实际上是是得到了了
45、一般的情情况下,我我们并不不能对ppUn的的地址,所所以(5)式和(6)式其实实传入的的参数是是一样当当都是传传入了 pUnn 的地地址。虽然我我们能够够对运算算符进行行重载,但但一般情情况下我我们并不不是很提提倡这种种操作,这这是因为为:暴露了封封装对象象的地址址,如上上面 CCCommPtrr 对 pUnn 的封封装其实实不起任任何作用用,任何何时候我我都可以以直接访访问和修修改 ppUn指指针,这这就意味味着所有有权的完完全丧失失,封装装不起任任何意义义对于 uunarry ooperratoor& 的重载载使得重重载对方方永远无无法与SSTL容容器进行行任何融融合,甚甚至无法法参与任任
46、何泛型型编程。一个对象象的地址址是一个个对象最最基本的的概念,在在一般情情况下,我我们并不不提倡,也也请大家家慎用地地址运算算符的重重载。指针运算算符重载载指针运运算符,有有一个及及其特殊殊且及其其重要的的机制:当你你对某个个型别实实施opperaatorr-而而这个型型别并非非原生指指针时候候:编译译器会从从这个型型别中找找出用户户自定义义的 ooperratoor-,并实实施后,编编译器将将继续对对这个ooperratoor-返回的的结果实实施 ooperratoor-直到找找到一个个原生指指针。这种机机制导致致了一个个特有的的技术:(prre aand posst ffuncctioon
47、 ccallls ),“前调用用”及后调调用技术术。应用用如下:claassCCalllDoSSomeethiingpubblicc:voiddDoCCalll()TRACCE(DooCalllnn);temmplaateclaassCCalllInMMutiiThrreaddclasssLoockPProxxypubllic:LockkProoxy(T*pT):m_ppT(pT)TRACCE(Loock n);LocckPrroxyy()TRACCE(UnnLocck n);T *ooperratoor-()retuurnmm_pTT;privvatee:T *mm_pTT;publlic:
48、CalllInMMutiiThrreadd(T* pTT):m_ppT(pT)LockkProoxyooperratoor-()retuurnLLockkProoxy(m_ppT);privvatee:T *mm_pTT;上面 CCalllDoSSomeethiing 是函数数调用,假假设这个个类原来来是在单单线程中中运行的的,但是是现在已已经移植植到了多多环境中中,所以以我们就就增加了了CalllInnMuttiThhreaad 对对原始类类进行配配接使之之适应与与多线程程环境,调调用过程程如下:CalllDoSSomeethiingDDoSoomthhingg;CaallIInMuutiT
49、Threead MuutiTThreead(&DooSommthiing);MuttiThhreaad-DoCCalll();调用结果果如下:Locck DoCCalllUnLLockk从上面面可以看看出在调调用 CCalllDoSSomeethiing 的成员员函数DDoCaall 之前调调用了 Locck方法法,在调调用结束束后有调调用了UUnLoock。这就是是所谓的的“前调用用”和“后调用用”,其实实并不仅仅仅是多多线程问问题可以以采用此此办法,所所有的“前调用用”和“后调用用”模式均均可由此此解。 重载载“-”运算符符,同时时引出了了智能指指针的概概念,参参见下页页。括号运算算符重载
50、载语法特特征:primmaryy-exxpreessiion(exppresssioon-llisttoptt)括号运运算符是是一个同同“-”运算符符一样也也是一个个及其重重要的运运算符在MSDDN上说说括号运运算符 是一个个二元运运算符,我觉得得这个说说法是完完全错误误的,在在所有CC+运运算符重重载中,括括号运算算符,应应该是唯唯一没有有规定参参数元的的个数的的。它的的参数可可以从 0 个个到 NN个。示例:cllasssPoiintpuubliic:Poinnt() _x = _yy = 0; Poinnt &opeerattor()( inttdx, inttdy ) _x += dd
51、x; _y += ddy; retturnn *thhis; prrivaate:int_x, _y;调用如下下:Poointtpt;pt( 3, 2 );从上面可可以看出出,括号号运算符符,调用用形式如如下:objeect(parrameeterr liist);看起来和和函数的的形式是是完全一一样的:funnctiion(parrameeterr liist);所以根据据这一特特点我们们称之为为仿函数数。第三章模模板学习要求求:1、了解解什么是是模板 2、学会会运用模模板函数数,模版版类和SSTL模板(ttempplattes),以以及以模模版为基基础的泛泛型编程程和泛型型模式,是是当今C
52、C+中中最活跃跃的一项项编程技技术,模模版的第第一个革革命性的的应用就就是Sttanddardd Teempllatee Liibraary(简简称STTL)。STLL将teempllatees 技技术广泛泛应用于于STLL容器和和STLL算法上上,在这这一领域域temmplaate 技术发发挥到了了极致。本章介介绍C+ ttempplattes 的基本本概念和和语言特特性1.1 认识模模板1、模板板的基本本语法是是:teempllatee decclarratiion这个teempllatee描述了了一个参参数化的的类(模模板类)或或者是一一个参数数化的函函数(模模板函数数),这这个模板板参
53、数列列表是用用逗号分分隔的类类型列表表(在这这个表单单忠使用用claass或或者是ttypeenamme来标标识这个个数据类类型)。在某些些情况下下这个模模板体内内可能不不存在任任何的数数据类型型。deeclaarattionn域必须须是一个个函数或或者类的的声明。模板函数数语法定定义: teempllateefuuncttionn-naame(parrameeterr liist)例如:teempllatee innlinne TT coonstt& mmax (T connst& a, T connst& b) / iif aa b tthenn usse bb ellse usee a
54、rretuurn abb?b:a; 调用形式式:11 :通通过调用用的参数数来识别别模板的的各参数数类型 MMAX (4,4.22); / OKK, bbut typpe oof ffirsst aarguumennt ddefiiness reeturrn ttypee22:明确确指定参参数的类类型:MAXX(4,4.22); /OOK在我们的的例子中中这个参参数列表表是 ttypeenamme TT,其实实在这里里 tyypennamee 是可可以用 claass 替换的的,tyypennamee 是是在C+演化化过程中中逐渐形形成的,而而claass是是一个历历史性的的概念,ttypee
55、namme 表表达了一一个比 claass 更抽象象意义上上的概念念。有如下下定义如如:classstyypennameedefftypeedeffinttINTT_TYYPE;如果这样样表达是是正确的的:tempplatteclaassttestttyppenaame:pubblicctyppenaameddefpubblicc:typeenammeT:INNT_TTYPEE;INT_TYPPEm_intt;但是如果果把此处处的tyypennamee 换成成 cllasss 就会会报错重载模板板函数(Overloading Function Templates)和普通的的函数一一样,模模板函
56、数数也可以以被重载载,也就就是说对对象同的的函数名名,你能能够具有有不同的的函数定定义,在在调用的的时候再再由C+编译译器决定定,那一一个候选选函数更更有资格格被匹配配调用。下面这个个简单的的例子说说明了重重载模板板函数的的方法和和过程:/ maxximuum oof ttwo intt vaaluees inllineeinttconnst& maax (inttconnst& a, inntcoonstt& b) retuurnaab?b:a; / maxximuum oof ttwo valluess off anny ttypee temmplaate inllineeTconnst&
57、 maax (Tconnst& a, Tconnst& b) retuurnaab?b:a; / maxximuum oof tthreee vvaluues of anyy tyype temmplaate inllineeTconnst& maax (Tconnst& a, Tconnst& b, Tconnst& c) retuurnmmax (maax(a,b), c); inttmaiin() :maxx(7, 422, 668); / ccallls tthe temmplaate forr thhreee arrgummentts :maxx(7.0, 42.0); / ccal
58、lls mmax (by arggumeent dedducttionn) :maxx(a, bb); / callls maxx (bby aarguumennt ddeduuctiion) :maxx(7, 422); / ccallls tthe nonntemmplaate forr twwo iintss :maxx(7, 42); / ccallls mmax (by arggumeent dedducttionn) :maxx(77, 442); / caallss maax (nno aarguumennt ddeduuctiion) 上面这个个例子也也说明了了普通的的函数与与
59、模板函函数可以以拥有同同一个名名字,而而且可以以被初始始化为同同一类型型,如:max(7, 42) 调用匹匹配非模模板函数数也匹配配模板函函数。模板类基本的的语法定定义:tempplattecllasss cllasss-naame;具有缺缺省参数数的模板板定义形形式teempllatee cllasss cllasss-naame;在模板板中用到到了大量量非习惯惯性思维维方法,大大家在学学习模板板之前需需要了解解这些模模板设计计的思维维方法:申明并并不一定定需要定定义:申明一个个函数,并并不实现现 在C+中我我们可能能因为禁禁止某个个缺省函函数的调调用操作作而申明明该缺省省函数,但但不定以以
60、它,例例如:classsteestDDecllareepuubliic:testtDecclarre();我们对上上面的ttesttDecclarre 的的缺省构构造函数数进行了了声明,但但是我们们并没有有构造函函数的的的定义,当当我们执执行testtDecclarre ddecllaree;上面这个个申请创创建一个个对象的的操作会会被编译译系统所所禁止当然,我我们也可可以对缺缺省的重重载运算算符实施施同样的的手段申明一个个函数而而不实现现可能是是为了模模板函数数的泛化化泛化:tempplatteTTtesstFuun();特化:ttempplatteiintttesttFunn()retuu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《CB 562-1968胶管螺纹接头》专题研究报告
- 葫芦岛市公安机关2025年公开招聘警务辅助人员备考题库及答案详解一套
- 2025年白城市镇赉县人社局公开招聘47人备考题库及参考答案详解一套
- 中国科学院武汉病毒研究所第四季度集中招聘20人备考题库及参考答案详解1套
- 基于生成式AI的中学英语课堂阅读理解能力提升策略研究教学研究课题报告
- 2025江苏无锡市宜兴市部分机关事业单位招聘编外人员40人(A类)考试重点题库及答案解析
- 2025湖南益阳市南县人武部公开招聘编外聘用人员备考考试试题及答案解析
- 2025年海洋风电浮式基础技术五年发展与环境载荷报告
- 连南农商银行2026校园招聘备考核心试题附答案解析
- 2025四川内江隆昌市响石镇中心学校招聘1人考试重点题库及答案解析
- 刷白 树干施工方案
- 空气能热泵中央热水系统调试
- GB/T 45542-2025工业锅炉综合能效评价技术规范
- 下肢淋巴水肿的管理实践
- QC提高高速公路镦粗直螺纹钢筋接头验收合格率QC成果
- JJF2085-2023低频角加速度台校准规范
- 北京麦田房产合同范本
- 《校园欺凌现象与学校社会工作干预的探索》14000字论文
- 交款合同范本
- 安全生产法律法规汇编(2025版)
- 《软件工程竣工验收指南》
评论
0/150
提交评论