华为C++中级培训教材.doc
《华为C++中级培训教材.doc》由会员分享,可在线阅读,更多相关《华为C++中级培训教材.doc(40页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、附件三:教材模板说明:一、为便于保存和管理,各类培训教材均采用合订本。二、教材结构:各类培训教材由教材封面、前言、课程目录、单门课程教材和封底五部分构成。三、教材封面:1、封面颜色:教材封面为彩色,工作基本常识教材为深蓝色,技术基础知识教材为草绿色,管理基础知识教材为浅蓝色,营销基础知识教材为墨绿色。2、教材名称:采用“工作基本常识”“技术基础知识”“管理基础知识”“营销基础知识”,字体为隶书,黑体,60号。3、其他标识:员工培训中心编辑采用宋体、黑体、三号,位于教材名称下面;华为技术有限公司采用宋体、黑体、小二,位于底端;华为标识位于华为技术有限公司和员工培训中心编辑之间;右上角为保密标识,
2、楷体,黑体,四号。四、教材封底:教材封底包括教材名称、华为技术有限公司员工培训中心和时间、版本号,位于页面的右下角。五、前言:教材前言为各类培训的目的、课程门类、特点、主要内容的简介。六、课程目录:为各门课程排列顺序的目录,统一编排页码,便于学员查找。七、单门课程教材:各单门课程教材由课程封面、章节目录、章节内容、学习要求、思考题、参考资料和相关网站组成。1、课程封面:课程封面为彩色,课程名称为隶书、60号、黑体、黑色,左上角为课程编码。2、章节目录:为宋体、小四、黑色3、章节内容:(1)标题:章节目分别以“第一章、第二章、第三章”“1.1、1.2、1.3”和“(1)(2)(3)”来表示。章为
3、宋体、小二、黑体,节为宋体、四号、黑体,目为宋体、小四、黑体。 (2)文字:每四个小时的培训课程,字数控制在1000020000字之间。教材文字一般为宋体、小四、黑色,行间距为一行半。(3)内容:章节内容要有完整的理论体系,不能成为授课胶片的翻版。4、学习要求:每章标题下面为本章的学习要求,以明确本章要掌握的要点。文字为楷体、小四。5、思考题:每章最后要有思考题,以便帮助学员复习、思考。6、参考资料和相关网站:有参考资料和相关网站的要附在课程后面,以便帮助学员查阅。 内部资料,注意保密C+中级培训教程员工培训中心 编辑2005年6月V1.0华为技术有限公司前 言 C+语言中级教材讲授C+语言的
4、运用技术,包括:类、对象之间的关系、对象的存储与布局、运算符重载、智能指针、仿函数、泛型编程,C+模式设计基本思想。 NEcV1.01业务与软件C+语言项目C+进阶目 录第一章 类、接口 71.1 Handle-Body与接口、抽象接口 71.2 多继承、与菱形缺陷、this跳转等 131.3 C+多态的两种多态形式和区别 18第二章 重载 182.1 函数重载 192.2 运算符重载 20 第三章 模板 293.1 模块函数 293.2 模块类313.3 STL标准模板库34附录:参考资料 39 前言我们在C+基础课程中已经了解了C+的一些基本概念,知道了什么是类什么是对象。也了解了继承、封
5、装、多态等C+面向对象的基本特征,本课程主要是更进一步探讨一下C+一些基本模型的应用,加深对概念的理解,由于课程时间有限,C+,模型和内容又如此之多,对任何一个模型都无法深入进去,所以只能泛泛而谈。第一章 类、接口 学习要求: 1、了解类的继承、封装等概念之间的关系 2、了解什么是接口,什么是虚函数,它有什么样的特点。学会使用接口编程的思想 本章节主要介绍C+中的类、接口。类,包涵了一组数据和一组基于数据上的一组方法。它描述了一个对象的属性、状态和行为;接口,它只是描述了一个对象的简单的行为。有关类的基本概念:Class names Class membersMember FunctionsS
6、tatic Member FunctionsUnionsC+ Bit FieldsNested Class DeclarationsType Names in Class ScopeMultiple Base ClassesVirtual FunctionsAbstract ClassesControlling Access to Class Membersprivate Membersprotected Memberspublic MembersAccess Specifiers for Base Classes,priavte,public、protectedFriends Constru
7、ctorsDestructorsConversion Functionsthe new operator and the delete operatorCopying Constructor FunctionsInterface1.1 Handle-Body与接口、抽象接口 在C+中封装的概念是把一个对象的外观接口同实际工作方式(实现)分离开来,但是C+的封装是不完全的,编译器必须知道一个对象的所有部分的声明,以便创建和管理它。我们可以想象一种只需声明一个对象的公共接口部分的编程语言,而将私有的实现部分隐藏起来。C + +在编译期间要尽可能多地做静态类型检查。这意味着尽早捕获错误,也意味着程序
8、具有更高的效率。然而这对私有的实现部分来说带来两个影响:一是即使程序员不能轻易地访问实现部分,但他可以看到它;二是造成一些不必要的重复编译。然而C+并没有将这个原则应用到二进制层次上,这是因为C+的类既是描述了一个接口同时也描述了实现的过程,示例如下:class CMyStringprivate:const int m_cch;char *m_psz;public:CMyString(const char *psz);CMyString();int Length() const;int Index(const char *psz) const;CMyStirng对外过多的暴露了内存布局实现的细
9、节,这些信息过度的依赖于这些成员变量的大小和顺序,从而导致了客户过度依赖于可执行代码之间的二进制耦合关系,这样的接口不利于跨语言跨平台的软件开发和移植。1.1.1 Handle-Body模式解决这个问题的技术有时叫句柄类( handle classes)或叫“Cheshire Cat” 1 。有关实现的任何东西都消失了,只剩一个单一的指针“m_pThis”。该指针指向一个结构,该结构的定义与其所有的成员函数的定义一样出现在实现文件中。这样,只要接口部分不改变,头文件就不需变动。而实现部分可以按需要任意更动,完成后只要对实现文件进行重新编译,然后再连接到项目中。这里有这项技术的简单例子。头文件中
10、只包含公共的接口和一个简单的没有完全指定的类指针。class CMyStringHandleprivate:class CMyString;CMyString *m_pThis;public:CMyStringHandle (const char *psz); CMyStringHandle ();int Length() const;int Index(const char *psz) const;;CMyStringHandle: CMyStringHandle(const char *psz):m_pThis(new CMyString(psz);CMyStringHandle: CMy
11、StringHandle() delete m_pThis;int CMyStringHandle:Length()return m_pThis-Length();int CMyStringHandle:Index(const char *psz) return m_pThis-Index(psz);这是所有客户程序员都能看到的。这行class CMyString;是一个没有完全指定的类型说明或类声明(一个类的定义包含类的主体)。它告诉编译器,cheshire 是一个结构的名字,但没有提供有关该结构的任何东西。这对产生一个指向结构的指针来说已经足够了。但我们在提供一个结构的主体部分之前不能创建
12、一个对象。在这种技术里,包含具体实现的结构主体被隐藏在实现文件中。在设计模式中,这就叫做Handle-Body 模式,Handle-Body只含有一个实体指针,服务的数据成员永远被封闭在服务系统中。Handle-Body模式如下:classHandlem_pThisclass图1 Handle-Body模式(句柄类做为接口)Handle-Body的布局结构永远不会随着实现类数据成员的加入或者删除或者修改而导致Handle-Body的修改,即Handle-Body协议不依赖于C+实现类的任何细节。这就有效的对用户的编译器隐藏了这些斜街,用户在使用对这项技术时候,Handle-Body 接口成了它
13、唯一的入口。然而Handle-Body模式也有自己的弱点:1、 接口类必须把每一个方法调用显示的传递给实现类,这在一个只有一个构造和一个析构的类来说显然不构成负担,但是如果一个庞大的类库,它有上百上千个方法时候,光是编写这些方法传递就有可能非常冗长,这也增加了出错的可能性。2、 对于关注于性能的应用每一个方法都得有两层的函数调用,嵌套的开销也不理想3、 由于句柄的存在依然存在编译连接器兼容性问题。接口和实现分离的Handle-Body。1.1.2 抽象接口使用了“接口与实现的分离”技术的 Handle-Body 解决了编译器/链接器的大部分问题,而C+面向对象编程中的抽象接口同样是运用了“接口
14、与实现分离”的思想,而采用抽象接口对于解决这类问题是一个极其完美的解决方案。1、 抽象接口的语言描述:class IMyStringvirtual int Length() const = 0; /这表示是一个纯虚函数,具有纯虚函数的接口virtual int Index(const char *psz) const = 0;;2、 抽象接口的内存结构:classvtprclass:m1class:m2图2 抽象接口的内存布局3、 抽象接口的实现代码:接口:class IMyStringvirtual int Length() const = 0; /这表示是一个纯虚函数,具有纯虚 /函数的接
15、口virtual int Index(const char *psz) const = 0;; 实现:class CMyString:public IMyStringprivate:const int m_cch;char *m_psz;public:CMyString(const char *psz);virtual CMyString();int Length() const;int Index(const char *psz) const;从上面采用抽象接口的实例来看,抽象接口解决了Handle-Body所遗留下来的全部缺陷。抽象接口的一个典型应用:抽象工厂(AbstractFactro
16、y)图3 抽象工厂模式1.2 多继承与菱形缺陷、this跳转等多重继承是C+语言独有的继承方式,其它几乎所有语言都秉承了单一继承的思想。这是因为多重继承致命的缺陷导致的:1.2.1 菱形缺陷当继承基类时,在派生类中就获得了基类所有的数据成员副本。假如类B 从A1和A2两个类多重继承而来,这样B类就包含A1、A2类的数据成员副本。考虑如果A1、A2都从某基类派生,该基类称为Base,现在继承关系如下:图4 菱形继承关系我们C+语言来描述这种继承关系:class Base ;class A1 :public Base ;class A2 :public Base ;class B :public
17、A1,public A2 ;那么A1、A2都具有Base的副本。这样B就包含了Base的两个副本,副本发生了重叠,不但增加了存储空间,同时也引入了二义性。这就是菱形缺陷,菱形缺陷时间是两个缺陷:1、 子对象重叠2、 向上映射的二义性。菱形缺陷的其中一种解决办法将在C+世界里最广泛的使用虚拟继承解决菱形缺陷的应用便是标准C+的输入/输出iostream;图5 标准C+的输入/输出1.2.2 多重接口与方法名冲突问题(Siamese twins)对继承而来的虚函数改写很容易,但是如果是在改写一个“在两个基类都有相同原型”的虚函数情况就不那么容易了。提出问题:假设汽车最大速度的接口为ICar,潜艇最
18、大速度的接口为 IBoat,有一个两栖类的交通工具它可以奔跑在马路上,也可以航行在大海中,那么它就同时拥有ICar、IBoat两种交通工具的最大速度特性,我们定义它的接口为ICarBoat;class ICar virtual int GetMaxSpeed()= 0;class IBoat virtual int GetMaxSpeed()= 0; 我们先对ICarBoat的接口做一个尝试:class CCarBoatvirtual int GetMaxSpeed();/既完成ICar的GetMaxSpeed()接口方法又 /完成IBoat的接口方法?显然不能够;解决问题:显然上面这个尝试根
19、本就无法成功,只用一个实现方法,怎么能够求出这个ICarBoat交通工具奔跑在马路上的最高时速,同时也能够求出航行在大海上的最大航行速度呢。上面这一问题矛盾就在一一个方法,却需要两个答案。看来ICarBoat要返回两个答案就必须有两个方法了,我们假设一个方法是求在陆地上奔跑的速度,名称为GetCarMaxSpeed();另一个方法是求在大海上航行的最大速度,名称为GetBoatMaxSpeed();那这两个方法又怎么和GetMaxSpeed()接口方法联系起来呢;幸运的是,我们找到了解决办法,而且解决办法有很多种,下面介绍一下继承法。class IXCar :public ICar virtu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 C+ 中级 培训教材
限制150内