您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 华为-C中级培训讲义
培训中心版权所有,未经许可不得向外传播,违者必究C++中级培训员工培训中心2005年7月1日蔡利元培训中心版权所有,未经许可不得向外传播,违者必究课程内容•第一章:类•第二章:接口•第三章:运算符重载•第四章:模板培训中心版权所有,未经许可不得向外传播,违者必究第一章:类•基本概念•类的基本特性•类的应用的特例培训中心版权所有,未经许可不得向外传播,违者必究基本概念•namespace•Classnames•Classmembers•MemberFunctions•StaticMemberFunctions•Unions•C++BitFields•NestedClassDeclarations•TypeNamesinClassScope•MultipleBaseClasses•VirtualFunctions•AbstractClasses•ControllingAccesstoClassMembers•privateMembers•protectedMembers•publicMembers•AccessSpecifiersforBaseClasses,priavte,public、protected•Friends•Constructors•Destructors•ConversionFunctions•thenewoperatorandthedeleteoperator•CopyingConstructorFunctions•Interface培训中心版权所有,未经许可不得向外传播,违者必究类的基本特性•构造函数与拷贝构造函数•静态成员与友元•组合与继承培训中心版权所有,未经许可不得向外传播,违者必究构造函数与拷贝构造函数•C++规定与类同名的函数就是拷贝构造函数•默认拷贝构造函数–在类定义中如果没有提供自己的拷贝构造函数,则C++提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。•深拷贝和浅拷贝–默认拷贝构造函数均是浅拷贝–但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存,析构函数释放了这个内存,则此时就需要进行深拷贝了–深拷贝不能依赖编译器实现培训中心版权所有,未经许可不得向外传播,违者必究静态成员与友元•静态成员使用static申明,在内存中永远只有一份实例•是类的对象所共有的•静态成员变量可以被成员函数访问,但静态成员函数只能访问静态成员变量•友元是为了一个普通函数直接访问一个类的保护甚至是私有成员的机制培训中心版权所有,未经许可不得向外传播,违者必究组合与继承•C++最重要的性能之一是代码重用–简单地创建一个包含已存在的类对象的新类,这称为组合,has-a关系–创建一个新类作为一个已存在类的类型,采取这个已存在类的形式,对它增加代码,但不修改它。称为继承,具有is-a关系,继承具有单一继承和多继承培训中心版权所有,未经许可不得向外传播,违者必究类的应用的特例•继承中的向上映射与切片问题•多继承中发生的菱形缺陷•this跳转培训中心版权所有,未经许可不得向外传播,违者必究继承中的向上映射与切片问题如果有classB:publicA;Bb;Aa=b;这就是切片现象而B*pb=newB;A*pa=pb;则不会发生切片,因为这只是指针的赋值而不涉及到切片现象培训中心版权所有,未经许可不得向外传播,违者必究多继承中发生的菱形缺陷•菱形缺陷导致的原因:–发生了菱形继承,如右图•两个缺陷:–子对象重叠–向上映射的二义性•解决办法:–修改多继承关系为单一继承关系或者是组合关系–进行虚继承A1A2BaseB培训中心版权所有,未经许可不得向外传播,违者必究this跳转•如右图继承关系对于一个已经实例化B类的对象bObject,永远有(B*)&bObject==(A*)&bObject成立•但是在多继承的世界内,上面的等式就不能恒成立,对象的同一性受到了挑战。•特别的是,在多继承世界内如果左下的菱形关系存在情况下,如果对于已经实例化B类的对象bObject;(Base*)(A1*)&bObject!=(Base*)(A2*)&bObject成立,当这种事情发生的时候我们就只能特殊处理了。这种情况在COM应用中处处都会发生。BAA1A2BaseB培训中心版权所有,未经许可不得向外传播,违者必究第二章:接口•基本知识•基本特性•接口应用的特例•应用举例培训中心版权所有,未经许可不得向外传播,违者必究基本概念•Class•Virtualfunctions•Purevirtualfunctions•Abstractclass•Struct&Interface培训中心版权所有,未经许可不得向外传播,违者必究基本特性•虚函数•纯虚函数•抽象类•接口培训中心版权所有,未经许可不得向外传播,违者必究虚函数•语法•特性•虚析构函数培训中心版权所有,未经许可不得向外传播,违者必究语法•在普通成员函数前面加virtual关键字•一个函数在基类申明一个virtual,那么在所有的派生类都是是virtual的•一个函数在基类为普通函数,在派生类定义为virtual的函数称为越位培训中心版权所有,未经许可不得向外传播,违者必究特性•实施晚期绑定(即运行时刻绑定),实施多态的一种方法•具有虚函数类的虚函数表的布局如下:classvtprclass::m1class::m2培训中心版权所有,未经许可不得向外传播,违者必究纯虚函数•语法:–成员函数前面加virtual关键在,在函数申明的”)”后标注“=0”关键字–在申明纯虚函数类中不能实现该函数培训中心版权所有,未经许可不得向外传播,违者必究抽象类•具有纯虚函数的类就是抽象类•抽象类不能被实例化,所以抽象类只能以指针方式被应用•抽象类可以防止切片的发生•抽象类不产生虚表。培训中心版权所有,未经许可不得向外传播,违者必究用户接口•接口的演化与接口的必要性•接口应用特例•接口应用示例培训中心版权所有,未经许可不得向外传播,违者必究接口的演化与接口的必要性•Handle-Body模式•抽象接口classHandlem_pThisclassclassvtprclass::m1class::m2培训中心版权所有,未经许可不得向外传播,违者必究接口应用特例•多重接口与方法名冲突问题(Siamesetwins)–提出问题:•假设汽车最大速度的接口为ICar,潜艇最大速度的接口为IBoat,有一个两栖类的交通工具它可以奔跑在马路上,也可以航行在大海中,那么它就同时拥有ICar、IBoat两种交通工具的最大速度特性,我们定义它的接口为ICarBoat;–解决问题•采用中间类的解决办法•内嵌内的解决办法(留给大家思考)培训中心版权所有,未经许可不得向外传播,违者必究采用中间类的解决办法培训中心版权所有,未经许可不得向外传播,违者必究接口应用示例•抽象工厂培训中心版权所有,未经许可不得向外传播,违者必究第二章:运算符重载•基本概念•可重载和不可重载•几类特殊的运算符重载•运算符重载的运用培训中心版权所有,未经许可不得向外传播,违者必究基本概念•OverloadedFunctions•OverloadedOperators•DeclarationMatching•ArgumentMatching•ArgumentTypesMatching•ArgumentCountsMatching•C++UnaryOperators•BinaryOperators•SmartPointer•FunctionObjects培训中心版权所有,未经许可不得向外传播,违者必究可重载和不可重载•可重载运算符–+*–/%^&–|~!=+=–=–*=/=%=^=&=|=–====!==–=&&||++*–,––[]()newnew[]deletedelete[]•不可重载运算符–..*::?:###///**/培训中心版权所有,未经许可不得向外传播,违者必究特殊的运算符重载(一)•运算符[]–下标运算符‘[]’必须是成员函数并且它需要单个参数。因为它暗示对象像数组一样动作,可以经常从这个运算符返回一个引用,所以它可以被很方便地用于等号左侧。这个运算符经常被重载•运算符new和delete–控制动态内存分配,当创建一个new表达式时有两件事发生。首先,使用运算符new分配内存,然后调用构造函数。在delete表达式里,调用析构函数,然后使用运算符delete释放内存。我们永远无法控制构造函数和析构函数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配算法new和delete培训中心版权所有,未经许可不得向外传播,违者必究特殊的运算符重载(二)•逗号运算符–当逗号出现在逗号运算对象左右时,逗号运算符被调用。然而,逗号运算符在函数参数表中出现时不被调用•重点介绍的运算符–转换运算符–运算符&(地址)–运算符-–运算符()培训中心版权所有,未经许可不得向外传播,违者必究转换运算符•转换函数名称–operator转换数据类型名,如MFC中的operatorLPCSTR•作用–通过在关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型•构造转换&运算符转换–用构造函数技术,目的类执行转换。然而使用运算符技术,是源类执行转换–构造函数技术的价值是在创建一个新类时为现有系统增加了新的转换途径。然而,创建一个单一参数的构造函数总是定义一个自动类型转换(即使它有不止一个参数也是一样,因为其余的参数将被缺省处理),这可能并不是我们所想要的。另外,使用构造函数技术没有办法实现从用户定义类型向内置类型转换,这只有运算符重载可能做到。培训中心版权所有,未经许可不得向外传播,违者必究运算符&•应用:–标准模板库中的std::auto_ptr–COM中的CComPtr•重载缺陷:–地址是一个对象的及其基本的特性,如果某类型重载&运算符,该类型将无法参与泛型编程–对于smartptr实施的&运算,意味着完全放弃了对拥有权的自动管理。当客户直接访问原生对象的时候,smartptr将失去它的辅助作用效应培训中心版权所有,未经许可不得向外传播,违者必究运算符-•Operator-机制–当你对某一型别实施operator-,而该型别并非原生指针时,编译器会继续对执行的结果实施operator-,直到得到一个原生指针•作用–SmartPointer的应用–可以对对象的成员函数实施“前调用”及“后调用”(pre-andpost-functioncalls)培训中心版权所有,未经许可不得向外传播,违者必究运算符()•functorsorfunctionobjects•特点–申明象对象(实际上也是对象),调用象函数•应用–广泛应用于STL的各种算法,实施函数配接培训中心版权所有,未经许可不得向外传播,违者必究运算符重载的运用•智能指针•仿函数培训中心版权所有,未经许可不得向外传播,违者必究智能指针•关键点–重载“-”运算符的对象•作用在多线程编程中自动进行加解锁操作自动实施对象引用连接计数,进行对象的生命周期管理培训中心版权所有,未经许可不得向外传播,违者必究仿函数•关键点–重载“()”运算符•作用主要用于函数配接,参数配接,广泛应用于STL培训中心版权所有,未经许可不得向外传播,违者必究第三章:模板•基本概念•基本语法•模板设计中的非习惯性思维•模板设计的基本方法•方法设计示例-•STL标准模板库•模板的佳作培训中心版权所有,未经许可不得向外传播,违者必究基本概念•typename•FunctionTemplates•ClassTemplates•STL(StandardTemplateLibrary)•functors、functionadpters•containers、iterator、traits、vector、list、deque、stack、queue、heap、set、map、hashtable、RB-tree•stlport、boost、loki培训中心版权所有,未经许可不得向外传播,违者必究基本
本文标题:华为-C中级培训讲义
链接地址:https://www.777doc.com/doc-968900 .html