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