面向对象编程技术C++_第1页
面向对象编程技术C++_第2页
面向对象编程技术C++_第3页
面向对象编程技术C++_第4页
面向对象编程技术C++_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1面向对象编程技术时间:周三,1、2 周五,7、8地点:研304周次:314周2公共交流平台: 功能:上课的文档、课堂的例程、作业要求等3主要内容 面向对象技术 C+语法概要 MFC框架基础详解 MFC文档/视图结构详解 几个应用程序开发实例 Visual C+应用程序设计 多线程程序设计 TCP/IP网络程序设计 动态连接库程序设计 数据库程序设计4第一部分第一部分 面向对象技术面向对象技术面向对象概念面向对象概念UMLUML5类和对象静态数据成员及成员函数对象与指针操作符重载和友员继承多态性6Visual C+集成开发环境简介Windows操作系统下的应用程序(SDK、MFC)用Appwi

2、zard开发一个MFC程序事件处理、映射模式及滚动视图GDI、颜色及字体对话框及控件ActiveX及IE公用控件位图7菜单、键盘及命令处理工具栏及状态栏文档和视图分离SDI及MDI文档的读写打印及打印予览拆分窗口及多视图8多线程程序设计数据库程序设计动态连接库程序设计TCP/IP网络程序设计9 面向对象建模与设计,Rumbaugh,电力出版社 面向对象分析与设计,Grady Booch,机械工业出版社 Thinking in C+,Bruce Eckel C+ Primer,Stanley B Lippman,中国电力出版社 C+语言及其程序设计教程,张国峰,电子工业出版社 C+程序设计教程,

3、钱能,清华大学出版社 深入浅出MFC,2Ed,侯俊杰(侯杰),松岗。 Visual C+ 技术内幕,Microsoft,北京希望电子出版社10 11第一部分第一部分 面向对象技术面向对象技术12面向过程思想问题域 (Domain)以问题域的系统流程为中心分析Sub1Sub2Subn.各子流程实现-函数化Func1Func2Funcn.根据系统的流程组建软件,通过函数的调用实现13面向对象思想问题域 (Domain)以问题域中的事物为中心思考问题Object1Object2Objectn.对象归类-抽象化Class1Class2Classn.类实例化:定义

4、对象,构建系统,形成解决方案14面向对象的基本概念 Coad和Yourdon给出了一个定义:“面向对象=对象+类+继承+通信”。 如果一个软件系统是使用这样 4 个概念设计和实现的,则我们认为这个软件系统是面向对象的。15对象 对象是面向对象开发模式的基本成份。 每个对象可用它本身的一组属性和它可以执行的一组操作来定义。 属性一般只能通过执行对象的操作来改变。 操作又称为方法或服务,它描述了对象执行的功能,若通过消息传递,还可以为其它对象使用。16消息(Message) 消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。 一个对象接收到消息则调用消息中指定的

5、方法,并将形式参数与参数表中相应的值结合起来。17类类 类是一组具有相同数据结构和相同操作的对象的集合。 类的定义包括一组数据属性和在数据上的一组合法操作。 类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。18 在一个类中,每个对象都是类的实例 (Instance),它们都可使用类中提供的函数。 对象的状态则包含在它的实例变量,即实例的属性中。19继承 (Inheritance) 继承是使用已存在的定义做为基础建立新定义的技术。 新类的定义是基础类所声明的数据和新类所增加的声明的组合。新类复用既存的定义,而不要求修改既存类。 既存类可当做基类来引用,则新类相应地可当做派生

6、类来引用。20 面向对象分析OOA 面向对象设计OOD 面向对象实现OOP21 面向对象技术是许多人历经多年研究积累的产物。 类的概念,是面向对象的重要组成部分。 Smalltalk,提出许多面向对象技术的核心概念,如:消息和继承。 Dijkstra的软件正确性理念,提出了用抽象层构造软件的观点。 Ada语言,提出了一般性和包两个概念。 C+语言,最广泛使用的面向对象的语言。 Java语言,健壮的、可移植的、流行的面向对象语言。22 1988年到1992年是面向对象方法学蓬勃发展的时期,人们从各自的经历和软件开发的经验提出了各种面向对象的开发方法,代表的有: Sally Shlaer 和 St

7、eve Mellor以信息模型化方法作为基础,并为目标系统增设了状态模型和过程模型; Peter Coad 和 Ed Yourdon则在信息模型化、面向对象的程序设计语言和基于知识的系统的基础上,建立了他们的OOA和OOD,主要工具是类与对象图、对象状态图和服务图; HP公司的Fusion开发方法。23 Wirfs-Brock的职责驱动设计(Responsibility-Driven Design),也称类-职责-协作Class-Responsibility-Collaboration (CRC) cards,用类所承担的责任来描述系统,利用责任把封装的概念带到分析与设计活动中去; Grady

8、 Booch在Rational软件公司开发Ada系统做了许多构件(Component),并以此由底向上构筑大型软件系统,即OOD方法; Jim Rumbaugh在通用电子(General Electric)领导一个研究小组,提出了对象建模技术(OMT)方法,通过面向对象的三种模型:对象模型、动态模型和功能模型,从不同角度对系统进行描述;24 Ivar Jacobson和他的 Objectory 公司开发了OOSE(Object Oriented Software Engineering)面向对象的软件工程,利用Use Cases来表达系统要求。 1994年任职于Rational公司的Grady

9、 Booch首先联合Jim Rumbaugh加盟Rational软件公司开始了统一OO方法学和工具的历程。以融合Booch和OMT方法的UML开发开始。1995年10月UML0.8发布。1995年秋,Ivar Jacobson和他的 Objectory 公司加盟Rational,UML中加入了OOSE方法,使其有可能最集中地包容当今最适用的各种OO方法。1996年,UML0.9版本发布,1997年1月,UML1.0被提交给OMG组织,作为软件建模语言的候选,1997年11月7日,UML1.1正式被OMG组织采纳为业界标准。UML经历了1.2,1.3,1.4。25Jim RumbaughGrad

10、y BoochIvar Jacobson26 有助于我们充分利用对象编程语言的能力。 有助于软件的复用和设计的复用 可以产生建立在稳定的中间形式上的系统,有助于系统的演化27 OOA和OOD是面向对象方法学中重要的部分,UML是具体的方法 OOP涉及到具体的编程语言,C+ 开发要使用合适的工具IDE:Visual C28291.1 1.1 C+C+的起源和特点的起源和特点 C C语言语言19721972年年, ,AT&TAT&T设计设计 为为改进改进C C语言语言,“带类的带类的C C”,1983,1983命名为命名为C+C+ 对对C C的类型系统改进和扩充的类型系统改进和扩充

11、( (更安全更安全) ) 支持面向对象支持面向对象 C+C+保持与保持与C C兼容兼容( (快速普及快速普及) ) C+C+不是纯粹的面向对象的语言不是纯粹的面向对象的语言301.2 程序的编译过程311.1.3 3 C+C+的词法记号的词法记号 关键字关键字 各种常量各种常量 操作符操作符 标识符标识符 分隔符分隔符321.1.4 4 C+C+程序的结构程序的结构33 注释注释 输入和输出输入和输出 函数函数 变量(对象)变量(对象) 符号常量符号常量 表达式表达式 语句语句341 1. .5 5C+C+的基本数据类型的基本数据类型351 1. .6 6常量常量 整数常量整数常量 浮点常量浮

12、点常量 字符常量字符常量 字符串常量字符串常量 布尔常量布尔常量361 1. .7 7对象声明对象声明 基本语法如下: 数据类型 标识符1,标识符2,。标识符n; 初始化 数据类型 标识符1(初始值1),标识符2(初始值2),。标识符n(初始值n); 数据类型 标识符1=初始值1,标识符2=初始值2,。标识符n=初始值n; 赋值 I=10;371 1. .8 8枚举类型枚举类型 定义:定义: 通过枚举一个类型的值域来定义一个数据类型,通过枚举一个类型的值域来定义一个数据类型,值域是通过在枚举声明时所指定的一组文字量值域是通过在枚举声明时所指定的一组文字量(又称枚举常量)指定的。(又称枚举常量)

13、指定的。 语法形式:语法形式: enum enum 标识符标识符 标识符标识符1 1,标识符,标识符2 2,标识符,标识符3 3,。标识符,。标识符n;n;381 1. .9 9表达式表达式 表达式由操作数和操作符组成,操作符分:表达式由操作数和操作符组成,操作符分: 算术操作符算术操作符:+ +、- -、* *、/ /、% %、+、- 关系操作符关系操作符: 、 =、=、!=!= 逻辑操作符逻辑操作符:&、|、! ! 逗号表达式逗号表达式:?:?: sizeofsizeof操作符操作符:sizeofsizeof 位操作符位操作符:& &、| |、 赋值操作符赋值操作符

14、:= =391 1. .1 10 0表达式中的类型强制表达式中的类型强制 隐含地从一种类型向另一种类型的值的映隐含地从一种类型向另一种类型的值的映射。射。 赋值类型强制赋值类型强制 右边的表达式类型映射成左值的类型。右边的表达式类型映射成左值的类型。 强制类型转换强制类型转换 static_cast(E)static_cast(E) T(E)T(E) (T)E(T)E40第第二二章章 C C+程序的基本程序的基本控制结构控制结构 顺序结构顺序结构 表达式语句表达式语句 空语句空语句 块语句块语句 选择结构选择结构 循环结构循环结构412 2. .1 1 选择结构选择结构 ifif if-els

15、eif-else及其嵌套及其嵌套 switchcaseswitchcase422 2. .2 2循环结构循环结构 whilewhile dowhiledowhile f foror43嵌套循环循环是可以嵌套的442 2. .3 3辅助控制语句辅助控制语句 gotogoto breakbreak continuecontinue45第第三三章章 函数函数463 3.1 .1 函数的基本概念函数的基本概念 完成特定功能的一段代码完成特定功能的一段代码具有合法的名称具有合法的名称具有一定返回类型具有一定返回类型可以多次调用可以多次调用 基本形式:基本形式:返回类型返回类型 函数名(形式参数函数名(形

16、式参数1 1,形式参数形式参数2 2,。,形式参数,。,形式参数n)n) 函数体;函数体; 473 3.2 .2 参数的传递参数的传递 值调用值调用 地址调用地址调用 引用调用引用调用 参数的求值顺序参数的求值顺序#include double Volume(double radius,double height);int main()double v;v=Volume(3.0,3.0);coutVolume=vendl;return 0;double Volume(double radius,double height)double result=3.14 * radius * radius

17、 * height;return result;483 3. .3 3 重载重载 具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。493 3. .4 4 带缺省参数值的函数带缺省参数值的函数 函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。例: void fun(int x,int y=0) void fun(int x)50 C+的类是对象的抽象 数据成员。 成员函数。lC+类的说明51举例:52 访问控制描述符 public后声明的是公有数据成员和成员函数,可被任何程序单元引用。 private

18、后声明的是私有数据成员和成员函数,仅可被类内部引用。 public和private出现的顺序和次数是任意的。53 类成员函数的实现举例54 一般语法: 类标识符 对象标识符; 可以声明多个对象,对象之间代码共享,数据独立。 可使用对象名引用对象的公有成员函数。方法如下: 对象名.成员函数名(参数列表);55 成员函数所操作的数据成员是该类的某个对象的数据成员。5657 构造函数的作用是在对象被创建时使用特定的值构造对象(初始化)。 析构函数的作用是在对象被删除时做一些清理工作。 构造函数与类同名。 析构函数是类名前加 两者无返回类型,析构函数无参数。58举例596061 函数体放在类体内。 函

19、数体放在类体外,使用inline关键字。6263#include class Locationpublic:Location(int x=0,int y=0);void Move(int x=5,int y=5);void ValueX(int x);int ValueX();void ValueY(int y);int ValueY();private:void Set(int x,int y);int X,Y;64Location:Location(int x,int y)Set(x,y);void Location:Move(int x,int y)Set(x,y);void Locat

20、ion:ValueX(int val)X=val;int Location:ValueX()return X;void Location:ValueY(int val)Y=val;int Location:ValueY()return Y;void Location:Set(int x,int y)X=x;Y=y;65int main()Location A,B; /Location A(0,0),B(0,0) A.Move(); /A.X和A.Y被设为5 A.ValueX(15); /A.X=15 coutA.ValueX()A.ValueY()endl; B.Move(6,2); /B.X

21、=6,B.Y=2 B.ValueY(4); coutB.ValueX()B.ValueY()endl; return 0;6667 一个标识符的有效区域。一个标识符的有效区域。 分为:函数原型作用域、块作用域、类作分为:函数原型作用域、块作用域、类作用域、文件作用域。用域、文件作用域。68 函数原型中所作的参数声明在该作用域,函数原型中所作的参数声明在该作用域,始于左括号,结束于右括号。始于左括号,结束于右括号。double A rea(double radi us); double A rea(double); 69 块作用域由一对花括号定义。(局部作用块作用域由一对花括号定义。(局部作用域

22、)域)70717273 标识符是否可以引用。标识符是否可以引用。 在嵌套作用域中,内层作用域的标识符优在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。先于外层作用域的标识符。 C+C+中,标识符必须先声明后引用,在同一中,标识符必须先声明后引用,在同一作用域中不能声明同样的标识符。作用域中不能声明同样的标识符。7475 静态生存期静态生存期 与程序的运行期相同。这种对象的存储单元相对位置与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变在整个程序的运行期间不变 文件作用域或用文件作用域或用staticstatic指定。指定。 若未显式指定初始值,为零。若未显式指

23、定初始值,为零。 动态生存期动态生存期 在函数内部(块作用域)声明的对象是动态生存期。在函数内部(块作用域)声明的对象是动态生存期。 若未显式指定初始值,为任意值。若未显式指定初始值,为任意值。767778 数据存储在局部对象中,通过参数传递机制实现数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。函数间的数据共享。 数据存储在全局对象中,通过全局对象进行数据数据存储在全局对象中,通过全局对象进行数据交换。交换。 封装在类中封装在类中 全局对象存在的问题全局对象存在的问题 可见性无限制可见性无限制 不能保证操作的合法性不能保证操作的合法性 解决上述问题的方法是类及其封装技术,相应提解

24、决上述问题的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。出静态数据成员和静态成员函数。79808182838485 指针:对象的地址指针:对象的地址 指针对象:存放指针的对象指针对象:存放指针的对象 声明指针对象的语法:声明指针对象的语法: T T * *标识符;标识符; int int * *pointer;pointer; 一个指针对象被赋值为一个对象的地址后,一个指针对象被赋值为一个对象的地址后,称指针指向对象。称指针指向对象。86 & -& -取地址操作取地址操作 * * - -目标操作目标操作Int val; Int *pointer; Pointer=

25、&val; Int *pointer(&val); *pointer =val 8788899091 数组:一组类型相同的对象 声明语法: 类型标识符元素个数; 数组元素可以用下标引用 数组名index; 数组元素也可以用指针引用92 通过指针引用数组元素 定义指针对象 数组的地址赋值给指针对象。 指针引用数组元素的方法 *(pointer + n) pointern93 没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。9495 是标识对象的一种机制(是对象的一个别名) 一般用作参数类型、函数返回类型。 一般语法如下: 基

26、本类型& 标识符 一个引用不是独立的对象,只是对另一个对象的引用。 基本类型& 标识符=对象;969798 在程序运行中根据需要在堆内存中创建的对象,使用完成后随时被删除。 创建语法如下: T* ptr=new T(初始值列表); 删除语法如下: delete ptr; 数组对象的创建 int* ptr=new int10; 数组对象的删除 delete ptr;99100101102 数组元素的类型是指针,这样的数组称指针数组。 语法: T* 标识符元素个数;103 多维数组可以解释为其元素是多维数组的一维数组。104 一个成员函数被调用时,被自动传递一个隐含的参数,该参数是

27、一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。105 用内部包含子对象的类实现复杂的类 子对象的初始化106107108109 当使用操作符来表达对对象的某个操作时,当使用操作符来表达对对象的某个操作时,可以将操作符函数声明为类的成员函数或可以将操作符函数声明为类的成员函数或类的友员函数。类的友员函数。 操作符的参数个数、优先级、结合性和使操作符的参数个数、优先级、结合性和使用语法是由用语法是由C+C+规定的,不能被改变。规定的,不能被改变。 重载操作符的形参不能具有缺省值。重载操作符的形参不能具有缺省值。 重载操作符的返回值类型任意,但最好不重载操

28、作符的返回值类型任意,但最好不是是void void 。110111112113114115116117118 一元函数最好重载为成员函数一元函数最好重载为成员函数 二元函数一般重载为友元函数二元函数一般重载为友元函数 27.5+27.5+x x 赋值操作符只能重载为成员函数赋值操作符只能重载为成员函数 27.5=27.5=x x +和和-操作符有两种形式,一般被重载为操作符有两种形式,一般被重载为成员函数成员函数 其中后缀操作重载后带有一个整型参数。其中后缀操作重载后带有一个整型参数。119 下标操作符只能被重载为成员函数下标操作符只能被重载为成员函数 函数调用操作符可以看作是下标操作符的函

29、数调用操作符可以看作是下标操作符的扩展扩展120 通过已有的类进行扩展产生新类的过程通过已有的类进行扩展产生新类的过程 产生的新类称派生类产生的新类称派生类 产生派生类的类称基类或父类。产生派生类的类称基类或父类。 从一个基类派生称单基继承,从多个基类从一个基类派生称单基继承,从多个基类派生称多基继承。派生称多基继承。121Mouse ScreenDeviceKeyboardTreeAppleTreeFruit122123 访问控制用于控制基类中声明的名字在多大的范围内能够被派生类的用户访问 访问控制有三种public,protected,private基类模块派生类模块间接派生类模块其他程序

30、模块124125126127128 对V模块是public 对H模块是private129 可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。130 派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。 构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。 一般形式如下: C:C(参数表0):C1(参数表1),C2(参数表2),Cn(参数表n) 131 如果冒号右边的某个基类的构造函数参数表为空,则可以省略该项。 构造对象时,先执行基类的构造函数,然后执行派生类的构造函数。析构时则相反。 多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中的顺序无关。132133134135 如果派生类的一个表达式引用基类中不止一个成员,则存在二义性。 解决二义性的办法是加类限定符。136137 如果一个派生类是从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的标识符进行访问时可能产生二义性。138BbB1b1Cf(),dBbB2b2139140 为避免一个基类在多条

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论