收藏 分享(赏)

C++中级培训胶片,C++精华.ppt

上传人:myw993772 文档编号:9421985 上传时间:2019-08-06 格式:PPT 页数:66 大小:1,007KB
下载 相关 举报
C++中级培训胶片,C++精华.ppt_第1页
第1页 / 共66页
C++中级培训胶片,C++精华.ppt_第2页
第2页 / 共66页
C++中级培训胶片,C++精华.ppt_第3页
第3页 / 共66页
C++中级培训胶片,C++精华.ppt_第4页
第4页 / 共66页
C++中级培训胶片,C++精华.ppt_第5页
第5页 / 共66页
点击查看更多>>
资源描述

1、员工培训中心 2005年7月1日,蔡利元,课程内容,第一章: 类 第二章:接 口 第三章:运算符重载 第四章:模 板,第一章: 类,基本概念 类的基本特性 类的应用的特例,基本概念,namespace Class names Class membersMember FunctionsStatic Member FunctionsUnionsC+ Bit FieldsNested Class DeclarationsType Names in Class ScopeMultiple Base ClassesVirtual FunctionsAbstract ClassesControlling

2、Access to Class Membersprivate Membersprotected Memberspublic MembersAccess Specifiers for Base Classes,priavte,public、protectedFriendsConstructorsDestructorsConversion Functionsthe new operator and the delete operatorCopying Constructor FunctionsInterface,类的基本特性,构造函数与拷贝构造函数 静态成员与友元 组合与继承,构造函数与拷贝构造函

3、数,C+规定与类同名的函数就是拷贝构造函数 默认拷贝构造函数 在类定义中如果没有提供自己的拷贝构造函数,则C+提供一个默认的构造函数,其拷贝策略是逐个成员依次拷贝。 深拷贝和浅拷贝 默认拷贝构造函数均是浅拷贝 但是一个类可能拥有其它资源,如其构造函数分配了一个堆内存,析构函数释放了这个内存,则此时就需要进行深拷贝了 深拷贝不能依赖编译器实现,静态成员与友元,静态成员使用static 申明,在内存中永远只有一份实例 是类的对象所共有的 静态成员变量可以被成员函数访问,但静态成员函数只能访问静态成员变量 友元是为了一个普通函数直接访问一个类的保护甚至是私有成员的机制,组合与继承,C + +最重要的

4、性能之一是代码重用 简单地创建一个包含已存在的类对象的新类,这称为组合,has-a 关系创建一个新类作为一个已存在类的类型,采取这个已存在类的形式,对它增加代码,但不修改它。称为继承,具有is-a关系,继承具有单一继承和多继承,类的应用的特例,继承中的向上映射与切片问题 多继承中发生的菱形缺陷 this跳转,继承中的向上映射与切片问题,如果有 class B:public A;B b;A a = b;这就是切片现象 而B *pb = new B;A *pa = pb;则不会发生切片,因为这只是指针的赋值而不涉及到切片现象,多继承中发生的菱形缺陷,菱形缺陷导致的原因: 发生了菱形继承,如右图 两

5、个缺陷: 子对象重叠 向上映射的二义性 解决办法: 修改多继承关系为单一继承关系或者是组合关系 进行虚继承,this跳转,如右图继承关系对于一个已经实例化B类的对象 bObject,永远有(B*) (Base*)(A1*)&bObject != (Base*)(A2*)&bObject 成立,当这种事情发生的时候我们就只能特殊处理了。这种情况在COM应用中处处都会发生 。,第二章:接 口,基本知识 基本特性 接口应用的特例 应用举例,基本概念,Class Virtual functions Pure virtual functions Abstract class Struct & Inter

6、face,基本特性,虚函数 纯虚函数 抽象类 接口,虚函数,语法 特性 虚析构函数,语法,在普通成员函数前面加 virtual 关键字 一个函数在基类申明一个virtual,那么在所有的派生类都是是virtual的 一个函数在基类为普通函数,在派生类定义为virtual的函数称为越位,特性,实施晚期绑定(即运行时刻绑定),实施多态的一种方法 具有虚函数类的虚函数表的布局如下:,纯虚函数,语法: 成员函数前面加 virtual 关键在,在函数申明的”)”后标注 “ = 0” 关键字 在申明纯虚函数类中不能实现该函数,抽象类,具有纯虚函数的类就是抽象类 抽象类不能被实例化,所以抽象类只能以指针方式

7、被应用 抽象类可以防止切片的发生 抽象类不产生虚表。,用户接口,接口的演化与接口的必要性 接口应用特例 接口应用示例,接口的演化与接口的必要性,Handle-Body 模式抽象接口,接口应用特例,多重接口与方法名冲突问题(Siamese twins) 提出问题: 假设汽车最大速度的接口为ICar,潜艇最大速度的接口为 IBoat,有一个两栖类的交通工具它可以奔跑在马路上,也可以航行在大海中,那么它就同时拥有ICar、IBoat两种交通工具的最大速度特性,我们定义它的接口为ICarBoat; 解决问题 采用中间类的解决办法 内嵌内的解决办法(留给大家思考),采用中间类的解决办法,接口应用示例,抽

8、象工厂,第二章:运算符重载,基本概念 可重载和不可重载 几类特殊的运算符重载 运算符重载的运用,基本概念,Overloaded Functions Overloaded Operators Declaration Matching Argument Matching Argument Types Matching Argument Counts Matching C+ Unary Operators Binary Operators Smart Pointer Function Objects,可重载和不可重载,可重载运算符 + * / % & | ! = += = *= /= %= = &=

9、 |= = = & | + * , () new new delete delete 不可重载运算符 . .* : ? : # # / /* */,特殊的运算符重载(一),运算符 下标运算符 必须是成员函数并且它需要单个参数。因为它暗示对象像数组一样动作,可以经常从这个运算符返回一个引用,所以它可以被很方便地用于等号左侧。这个运算符经常被重载 运算符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释放内存。我们

10、永远无法控制构造函数和析构函数的调用(否则我们可能意外地搅乱它们),但可以改变内存分配算法n e w和d e l e t e,特殊的运算符重载(二),逗号运算符 当逗号出现在逗号运算对象左右时,逗号运算符被调用。然而,逗号运算符在函数参数表中出现时不被调用 重点介绍的运算符 转换运算符 运算符&(地址) 运算符- 运算符( ),转换运算符,转换函数名称 operator 转换数据类型名,如 MFC 中的operator LPCSTR 作用 通过在关键字operator后跟随想要转换到的类型的方法,将当前类型转换为希望的类型 构造转换&运算符转换 用构造函数技术,目的类执行转换。然而使用运算符技

11、术,是源类执行转换 构造函数技术的价值是在创建一个新类时为现有系统增加了新的转换途径。然而,创建一个单一参数的构造函数总是定义一个自动类型转换(即使它有不止一个参数也是一样,因为其余的参数将被缺省处理),这可能并不是我们所想要的。另外,使用构造函数技术没有办法实现从用户定义类型向内置类型转换,这只有运算符重载可能做到。,运算符&,应用: 标准模板库中的std:auto_ptr COM中的CComPtr 重载缺陷: 地址是一个对象的及其基本的特性,如果某类型重载 & 运算符,该类型将无法参与泛型编程 对于smart ptr 实施的&运算,意味着完全放弃了对拥有权的自动管理。当客户直接访问原生对象

12、的时候,smart ptr 将失去它的辅助作用效应,运算符-,Operator- 机制 当你对某一型别实施operator-,而该型别并非原生指针时,编译器会继续对执行的结果实施operator-,直到得到一个原生指针 作用 Smart Pointer的应用 可以对对象的成员函数实施“前调用”及“后调用” (pre- and post- function calls),运算符( ),functors or function objects 特点 申明象对象(实际上也是对象),调用象函数 应用 广泛应用于STL的各种算法,实施函数配接,运算符重载的运用,智能指针 仿函数,智能指针,关键点 重载“

13、-”运算符的对象 作用 在多线程编程中自动进行加解锁操作 自动实施对象引用连接计数,进行对象的生命周期管理,仿函数,关键点 重载“()”运算符 作用 主要用于函数配接,参数配接,广泛应用于STL,第三章:模 板,基本概念 基本语法 模板设计中的非习惯性思维 模板设计的基本方法 方法设计示例- STL标准模板库 模板的佳作,基本概念,typename Function Templates Class Templates STL(Standard Template Library) functors、function adpters containers、iterator、traits、vecto

14、r、list、deque、stack、queue、heap、set、map、hashtable、RB-tree stlport、boost、loki,基本语法,template declaration这个template描述了一个参数化的类(模板类)或者是一个参数化的函数(模板函数),这个模板参数列表是用逗号分隔的类型列表(在这个表单忠使用 class 或者是 typename 来标识这个数据类型)。在某些情况下这个模板体内可能不存在任何的数据类型。declaration 域必须是一个函数或者类的声明,模板设计中的非习惯性思维,申明并不一定要定义 定义类不一定要有成员、成员不仅仅是方法和成员变

15、量,定义类不一定要有成员 成员不仅是方法和成员变量,class EmptyType ; template struct iterator_traits typedef 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; ; Temp

16、late struct int2type enum value = v ;,申明并不一定要定义,申明一个函数,并不定义 禁止某种缺省函数的调用 申明一个函数而不实现可能是为了模板函数的泛化 申明一个函数可能仅仅为了获得特殊某一项功能 申明一个类而不实现 禁止模板类的泛化,只允许特化 实施编译某项功能的检测如:编译时刻断言,模板设计的基本方法,编译器断言 模板特化 局部类 常数映射型别 型别映射型别 型别选择 Null class or null function 和 Empty class Type Traits 模板嵌套 Policy class,利用模板设计的方法解题,编译时刻测试类型的可

17、转换性 用到的技术: 只定义不实现 函数多态性 可变参函数 sizeof template typedef char small;class big char dummy2;static small test(U); 只定义不实现static big test() ; static T markT(); /函数定义只是为了得到一个返回类型 public;enum value = sizeof(test(makT()= sizeof(Small) ; ;,STL标准模板库,容器 迭代器 算法 仿函数 配接器,容器,序列容器 vector,list、deque、stack(没有迭代器)、queue

18、(没有迭代器)、即stack、queue不允许遍历行为 关联容器 set(标准)、map(标准)、hash_table、 RB-tree 通用算法 begin()、end()、size()、empty()、erase(iterator _position)、clear(),迭代器,迭代器的基本算法 迭代器型别 型别萃取,迭代器的基本算法,能够进行+、+、-、+=、=、= = 、!=等运算 是一种智能性指针,实现operator * operator -的重载 根据迭代器的特点,迭代器又称循环子 迭代器前闭后开区间 first, last),型别,单向迭代器 可逆迭代器 随机迭代器迭代器的继承关

19、系:,型别萃取,型别 value_type difference_type refrence_type pointer_type iterator_category 型别萃取机 iterator_traits,算法,数值运算 power、itoa、accumulate 基本运算 fill、fill_n、swap、max、min、iter_swap、copy 集合运算 set_union、set_interseion、set_diffrence 数据整理(以循环子为参数) count、count_if、find、find_if、for_each、merge、sort、upper、search、s

20、earch_n,仿函数,一元仿函数 二元仿函数 二元化一元仿函数 仿函数应用,一元仿函数,template struct unary_function typedef _Arg argument_type;typedef _Result result_type; ; template struct negate:public unary_function _Tp operator()(const T :,二元仿函数,template struct less : public binary_function bool operator()(const _Tp,二元化一元仿函数,Class bin

21、der1st binder1st(const Operation ,仿函数应用,template inline _InputIter _find_if(_InputIter _first, _InputIter _last, Operation _op,const input_iterator_tag ,配接器,容器配接器 stack Queue 迭代配接器 Reverse Iterators IOStream Iterators Inert_Iterator 仿函数配接器,容器配接器,容器配接器 Stacktemplate class stack Queuequeue myQueue;,仿函

22、数配接器,绑定 bind1st、 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 (param-*f)(x) or (param.*f)(x

23、),仿函数配接器,举例 不小于 x 表达式 not1(bind2nd(less(),x) f ( g (x) ) 的表达式 Compose1(f,g) find_if( first , end, mem_fun( ,STL库引用,标准引用办法 #include #include using namespace std; 错误引用办法 #include #include,参考资料,C+ Programming Language C+ Primer thinking in c+ effective c+ C+ Templates STL源码剖析 Modern C+ Design 设计模式 COM本质论,共享源代码,ICE(中间件编程) ACE(跨平台网络编程) Stlport boost (标准C+委员会的杰作) Loki,谢谢,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报