《中级培训胶片》由会员分享,可在线阅读,更多相关《中级培训胶片(66页珍藏版)》请在金锄头文库上搜索。
1、培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究C+中级培训中级培训员工培训中心2005年7月1日培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究课程内容课程内容第一章: 类第二章:接 口第三章:运算符重载第四章:模 板培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究第一章: 类基本概念类的基本特性类的应用的特例培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究基本概念 namespace Class na
2、mes Class membersMember FunctionsStatic 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,priav
3、te,public、protectedFriends ConstructorsDestructorsConversion Functionsthe new operator and the delete operatorCopying Constructor FunctionsInterface培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究类的基本特性构造函数与拷贝构造函数静态成员与友元组合与继承培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究构造函数与拷贝构造函数C+规定与类同名的函数就是拷贝构
4、造函数默认拷贝构造函数在类定义中如果没有提供自己的拷贝构造函数,则C+提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。深拷贝和浅拷贝默认拷贝构造函数均是浅拷贝但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存,析构函数释放了这个内存,则此时就需要进行深拷贝了深拷贝不能依赖编译器实现培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究静态成员与友元静态成员使用static 申明,在内存中永远只有一份实例是类的对象所共有的静态成员变量可以被成员函数访问,但静态成员函数只能访问静态成员变量友元是为了一个普通函数直接访问一个类的保护甚至是私有成员
5、的机制培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究组合与继承C + +最重要的性能之一是代码重用简单地创建一个包含已存在的类对象的新类,这称为组合,has-a 关系创建一个新类作为一个已存在类的类型,采取这个已存在类的形式,对它增加代码,但不修改它。称为继承,具有is-a关系,继承具有单一继承和多继承培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究类的应用的特例继承中的向上映射与切片问题多继承中发生的菱形缺陷this跳转培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不
6、得向外传播,违者必究继承中的向上映射与切片问题如果有 class B:public A;B b;A a = b;这就是切片现象而B *pb = new B;A *pa = pb;则不会发生切片,因为这只是指针的赋值而不涉及到切片现象培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究多继承中发生的菱形缺陷菱形缺陷导致的原因:发生了菱形继承,如右图两个缺陷:子对象重叠向上映射的二义性 解决办法:修改多继承关系为单一继承关系或者是组合关系进行虚继承培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究this跳转
7、如右图继承关系对于一个已经实例化B类的对象 bObject,永远有(B*)&bObject =(A*)&bObject 成立 但是在多继承的世界内,上面的等式就不能恒成立,对象的同一性受到了挑战。特别的是,在多继承世界内如果左下的菱形关系存在情况下,如果对于已经实例化B类的对象bObject; (Base*)(A1*)&bObject != (Base*)(A2*)&bObject 成立,当这种事情发生的时候我们就只能特殊处理了。这种情况在COM应用中处处都会发生 。培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究第二章:接 口基本知识基本特性接
8、口应用的特例应用举例培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究基本概念ClassVirtual functionsPure virtual functionsAbstract classStruct & Interface培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究基本特性虚函数纯虚函数抽象类接口培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究虚函数语法特性虚析构函数培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不
9、得向外传播,违者必究语法在普通成员函数前面加 virtual 关键字一个函数在基类申明一个virtual,那么在所有的派生类都是是virtual的一个函数在基类为普通函数,在派生类定义为virtual的函数称为越位培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究特性实施晚期绑定(即运行时刻绑定),实施多态的一种方法具有虚函数类的虚函数表的布局如下:classvtprclass:m1class:m2培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究纯虚函数语法:成员函数前面加 virtual 关键在,在
10、函数申明的”)”后标注 “ = 0” 关键字在申明纯虚函数类中不能实现该函数培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究抽象类具有纯虚函数的类就是抽象类抽象类不能被实例化,所以抽象类只能以指针方式被应用抽象类可以防止切片的发生抽象类不产生虚表。培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究用户接口接口的演化与接口的必要性接口应用特例接口应用示例培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究接口的演化与接口的必要性Handle-Body 模式抽象
11、接口classHandlem_pThisclassclassvtprclass:m1class:m2培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究接口应用特例多重接口与方法名冲突问题(多重接口与方法名冲突问题(Siamese twins)提出问题:提出问题:假设汽车最大速度的接口为ICar,潜艇最大速度的接口为 IBoat,有一个两栖类的交通工具它可以奔跑在马路上,也可以航行在大海中,那么它就同时拥有ICar、IBoat两种交通工具的最大速度特性,我们定义它的接口为ICarBoat;解决问题解决问题采用中间类的解决办法内嵌内的解决办法(留给大家
12、思考) 培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究采用中间类的解决办法培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究接口应用示例抽象工厂培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究第二章:运算符重载基本概念可重载和不可重载几类特殊的运算符重载运算符重载的运用培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究基本概念Overloaded FunctionsOverloaded OperatorsD
13、eclaration MatchingArgument MatchingArgument Types MatchingArgument Counts MatchingC+ Unary OperatorsBinary OperatorsSmart Pointer Function Objects培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究可重载和不可重载可重载运算符+ */ % &| ! = +=*= /= %= = &= |= = = = != = & | + *, () new new delete delete不可重载运算符. .* :
14、? : # # / /* */培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究特殊的运算符重载(一)运算符 下标运算符 必须是成员函数并且它需要单个参数。因为它暗示对象像数组一样动作,可以经常从这个运算符返回一个引用,所以它可以被很方便地用于等号左侧。这个运算符经常被重载运算符n e w和d e l e t e控制动态内存分配,当创建一个n e w表达式时有两件事发生。首先,使用运算符n e w分配内存,然后调用构造函数。在d e l e t e表达式里,调用析构函数,然后使用运算符d e l e t e释放内存。我们永远无法控制构造函数和析构函
15、数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配算法n e w和d e l e t e培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究特殊的运算符重载(二)逗号运算符当逗号出现在逗号运算对象左右时,逗号运算符被调用。然而,逗号运算符在函数参数表中出现时不被调用重点介绍的运算符转换运算符运算符&(地址)运算符-运算符( )培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究转换运算符转换函数名称operator 转换数据类型名,如 MFC 中的operator LPCSTR作用通过在关键字ope
16、rator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型构造转换&运算符转换用构造函数技术,目的类执行转换。然而使用运算符技术,是源类执行转换构造函数技术的价值是在创建一个新类时为现有系统增加了新的转换途径。然而,创建一个单一参数的构造函数总是定义一个自动类型转换(即使它有不止一个参数也是一样,因为其余的参数将被缺省处理),这可能并不是我们所想要的。另外,使用构造函数技术没有办法实现从用户定义类型向内置类型转换,这只有运算符重载可能做到。培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究运算符&应用:标准模板库中的std:auto_ptr
17、COM中的CComPtr重载缺陷:地址是一个对象的及其基本的特性,如果某类型重载 & 运算符,该类型将无法参与泛型编程对于smart ptr 实施的&运算,意味着完全放弃了对拥有权的自动管理。当客户直接访问原生对象的时候,smart ptr 将失去它的辅助作用效应培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究运算符-Operator- 机制当你对某一型别实施operator-,而该型别并非原生指针时,编译器会继续对执行的结果实施operator-,直到得到一个原生指针作用Smart Pointer的应用可以对对象的成员函数实施“前调用”及“后调
18、用” (pre- and post- function calls)培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究运算符( )functors or function objects特点申明象对象(实际上也是对象),调用象函数应用广泛应用于STL的各种算法,实施函数配接培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究运算符重载的运用智能指针仿函数培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究智能指针关键点重载“-”运算符的对象作用在多线程编程中自动
19、进行加解锁操作自动实施对象引用连接计数,进行对象的生命周期管理培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究仿函数关键点重载“()”运算符作用主要用于函数配接,参数配接,广泛应用于STL培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究第三章:模 板基本概念基本语法模板设计中的非习惯性思维模板设计的基本方法方法设计示例-STL标准模板库模板的佳作培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究基本概念typenameFunction Templates
20、 Class Templates STL(Standard Template Library)functors、function adpterscontainers、iterator、traits、vector、list、deque、stack、queue、heap、set、map、hashtable、RB-treestlport、boost、loki培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究基本语法template declaration这个template描述了一个参数化的类(模板类)或者是一个参数化的函数(模板函数),这个模板参数列表
21、是用逗号分隔的类型列表(在这个表单忠使用 class 或者是 typename 来标识这个数据类型)。在某些情况下这个模板体内可能不存在任何的数据类型。declaration 域必须是一个函数或者类的声明 培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究模板设计中的非习惯性思维申明并不一定要定义定义类不一定要有成员、成员不仅仅是方法和成员变量培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究定义类不一定要有成员成员不仅是方法和成员变量class EmptyType;templatestruct ite
22、rator_traitstypedef typename I:iterator_category iterator_categorytypedef typename I:value_type value_type;typedef typename I:difference_type differnce_type;typedef typename I:pointer pointer;typedef typename I:refrence refrence;Template struct int2type enum value = v ;培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权
23、所有,未经许可不得向外传播,违者必究申明并不一定要定义申明一个函数,并不定义禁止某种缺省函数的调用申明一个函数而不实现可能是为了模板函数的泛化申明一个函数可能仅仅为了获得特殊某一项功能申明一个类而不实现禁止模板类的泛化,只允许特化实施编译某项功能的检测如:编译时刻断言培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究模板设计的基本方法编译器断言模板特化局部类常数映射型别型别映射型别型别选择Null class or null function 和 Empty classType Traits模板嵌套Policy class培训中心版权所有,未经许可
24、不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究利用模板设计的方法解题编译时刻测试类型的可转换性用到的技术:只定义不实现函数多态性可变参函数sizeoftemplatetypedef char small; class big char dummy2;static small test(U);只定义不实现static big test();static T markT();/函数定义只是为了得到一个返回类型public;enum value = sizeof(test(makT()= sizeof(Small) ;培训中心版权所有,未经许可不得向外传播,违者必究培训中心版
25、权所有,未经许可不得向外传播,违者必究STL标准模板库容器迭代器算法仿函数配接器培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究容器序列容器vector,list、deque、stack(没有迭代器)、queue(没有迭代器)、即stack、queue不允许遍历行为关联容器set(标准)、map(标准)、hash_table、 RB-tree通用算法begin()、end()、size()、empty()、erase(iterator _position)、clear()培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不
26、得向外传播,违者必究迭代器迭代器的基本算法迭代器型别型别萃取培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究迭代器的基本算法能够进行+、+、-、+=、=、= = 、!=等运算是一种智能性指针,实现operator * operator -的重载根据迭代器的特点,迭代器又称循环子迭代器前闭后开区间 first, last)培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究型别 单向迭代器可逆迭代器随机迭代器 迭代器的继承关系: 培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不
27、得向外传播,违者必究型别萃取型别value_typedifference_typerefrence_typepointer_typeiterator_category型别萃取机iterator_traits培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究算法数值运算power、itoa、accumulate基本运算fill、fill_n、s、min、iter_s集合运算set_union、set_interseion、set_diffrence数据整理(以循环子为参数)count、count_if、find、find_if、for_each、me
28、rge、sort、upper、search、search_n培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究仿函数一元仿函数二元仿函数二元化一元仿函数仿函数应用培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究一元仿函数template struct unary_function typedef _Arg argument_type; typedef _Result result_type;templatestruct negate:public unary_function_Tp operator(
29、)(const T&x) const return x;:培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究二元仿函数template struct less : public binary_function bool operator()(const _Tp& _x, const _Tp& _y) const return _x _y; ;培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究二元化一元仿函数Class binder1st binder1st(const Operation &op, co
30、nst T1 &y); operator()(const T2 &x);培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究仿函数应用template inline _InputIter _find_if(_InputIter _first, _InputIter _last, Operation _op, const input_iterator_tag &) while (_first != _last & !_op(*_first) +_first; return _first;培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,
31、未经许可不得向外传播,违者必究配接器容器配接器stackQueue迭代配接器Reverse IteratorsIOStream IteratorsInert_Iterator仿函数配接器培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究容器配接器容器配接器Stacktemplate class _Tp, class _Sequence = deque class stack Queuequeue int , list myQueue;培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究仿函数配接器绑定bi
32、nd1st、 bind2ndop(x,param) or op(param,x)修饰not1、not2!op(param) or !op(param1,param2)组合compose1、compose2op1(op2(param);培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究仿函数配接器函数配接ptr_fun1、ptr_fun2fp(param) or fp(param1,param2)对象配接mem_fun、mem_fun_ref、mem_fun1、mem_fun1_ref (param-*f)() or (param.*f)() or
33、(param-*f)(x) or (param.*f)(x)培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究仿函数配接器举例不小于 x 表达式 not1(bind2nd(less(),x)f ( g (x) ) 的表达式Compose1(f,g)find_if( first , end, mem_fun( &clsss:fun ) );培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究STL库引用标准引用办法#include#includeusing namespace std;错误引用办法#incl
34、ude#include培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究参考资料C+ Programming LanguageC+ Primerthinking in c+effective c+C+ Templates STL源码剖析Modern C+ Design设计模式COM本质论培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究共享源代码ICE(中间件编程)ACE(跨平台网络编程)Stlportboost (标准C+委员会的杰作)Loki培训中心版权所有,未经许可不得向外传播,违者必究培训中心版权所有,未经许可不得向外传播,违者必究谢谢谢谢