面向对象资料课件_第1页
面向对象资料课件_第2页
面向对象资料课件_第3页
面向对象资料课件_第4页
面向对象资料课件_第5页
已阅读5页,还剩154页未读 继续免费阅读

下载本文档

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

文档简介

1、面向对象资料1面向对象资料2授课教师:郝应光邮件地址:面向对象资料3l本课程的成绩由期末考试和平时作业2部分构成l平时成绩由:期末大作业+平时随堂作业构成l具体比例待定面向对象资料4l面向对象技术lC+语法概要(6)lMFC框架基础详解(15)lMFC文档/视图结构详解(9)l几个应用程序开发实例(6)lVisual C+应用程序设计(12)多线程程序设计(3)TCP/IP网络程序设计(3)动态连接库程序设计(3)数据库程序设计(3)面向对象资料5l面向对象概念面向对象概念lUMLUML面向对象资料6类和对象静态数据成员及成员函数对象与指针操作符重载和友员继承多态性面向对象资料7Visual

2、C+集成开发环境简介Windows操作系统下的应用程序(SDK、MFC)用Appwizard开发一个MFC程序事件处理、映射模式及滚动视图GDI、颜色及字体对话框及控件ActiveX及IE公用控件位图面向对象资料8菜单、键盘及命令处理工具栏及状态栏文档和视图分离SDI及MDI文档的读写打印及打印予览拆分窗口及多视图面向对象资料9多线程程序设计数据库程序设计动态连接库程序设计TCP/IP网络程序设计面向对象资料10l面向对象建模与设计,面向对象建模与设计,RumbaughRumbaugh,电力出版社,电力出版社l面向对象分析与设计,面向对象分析与设计,Grady BoochGrady Booch

3、,机械工业出版,机械工业出版社社lThinking in C+Thinking in C+,Bruce EckelBruce EckellC+ PrimerC+ Primer,Stanley B LippmanStanley B Lippman,中国电力出版社,中国电力出版社lC+C+语言及其程序设计教程,张国峰,电子工业出语言及其程序设计教程,张国峰,电子工业出版社版社l深入浅出深入浅出MFCMFC,2Ed2Ed,侯俊杰(侯杰),松岗。,侯俊杰(侯杰),松岗。lVisual C+ Visual C+ 技术内幕,技术内幕,MicrosoftMicrosoft,北京希望电子出,北京希望电子出版社

4、版社面向对象资料11l(microsoft)l(世界最大开源代码库)面向对象资料12面向对象资料软件开发软件开发的过程就是程序员对客观世界问题域形式化的过程面向对象资料计算机开发语言v机器语言、汇编语言、高级语言,高级语言可能有几千种v计算机语言都是某种程度的形式语言面向对象资料v计算机高级语言的历史由美国科学家巴科斯设计,1956年在IBM计算机上实现的FORTRAN。70年代以来的PASCAL80年代,C语言80年代后期,C+90年代以来,语言要OO而且Visual,更要Web,Java快速推广。面向对象资料vPO方法:现实世界 流程图(变量,函数) PO语言 执行求解 vOO方法:现实世

5、界 类图(对象,方法) OO语言 执行求解OO作为一种思想及编程语言,为软件开发的整个过程:分析、设计到coding,提供了一个完整解决方案。从PO到OO面向对象资料17问题域 (Domain)以问题域的系统流程为中心分析Sub1Sub2Subn.各子流程实现-函数化Func1Func2Funcn.根据系统的流程组建软件,通过函数的调用实现面向对象资料18问题域 (Domain)以问题域中的事物为中心思考问题Object1Object2Objectn.对象归类-抽象化Class1Class2Classn.类实例化:定义对象,构建系统,形成解决方案面向对象资料19lCoad和Yourdon给出了

6、一个定义:“面向对象=对象+类+继承+通信”。l如果一个软件系统是使用这样 4 个概念设计和实现的,则我们认为这个软件系统是面向对象的。面向对象资料20l对象是面向对象开发模式的基本成份。l每个对象可用它本身的一组属性和它可以执行的一组操作来定义。l属性一般只能通过执行对象的操作来改变。l操作又称为方法或服务,它描述了对象执行的功能,若通过消息传递,还可以为其它对象使用。面向对象资料21l消息是一个对象与另一个对象的通信单元,是要求某个对象执行类中定义的某个操作的规格说明。l一个对象接收到消息则调用消息中指定的方法,并将形式参数与参数表中相应的值结合起来。面向对象资料22l类是一组具有相同数据

7、结构和相同操作的对象的集合。l类的定义包括一组数据属性和在数据上的一组合法操作。l类定义可以视为一个具有类似特性与共同行为的对象的模板,可用来产生对象。面向对象资料23l同一个类的每个对象都是类的实例 (Instance)(Instance),它们都可使用类中提供的函数。l对象的状态则包含在它的实例变量,即实例的属性中。面向对象资料24l继承是使用已存在的定义做为基础建立新定义的技术。l新类的定义是基础类所声明的数据和新类所增加的声明的组合。新类复用既存的定义,而不要求修改既存类。l既存类可当做基类来引用,则新类相应地可当做派生类来引用。面向对象资料25l面向对象分析OOAl面向对象设计OOD

8、l面向对象实现OOP面向对象资料26l面向对象技术是许多人历经多年研究积累的产物。类的概念,是面向对象的重要组成部分。Smalltalk,提出许多面向对象技术的核心概念,如:消息和继承。Dijkstra的软件正确性理念,提出了用抽象层构造软件的观点。Ada语言,提出了一般性和包两个概念。C+语言,最广泛使用的面向对象的语言。Java语言,健壮的、可移植的、流行的面向对象语言。面向对象资料27l1988年到1992年是面向对象方法学蓬勃发展的时期,人们从各自的经历和软件开发的经验提出了各种面向对象的开发方法,代表的有:Sally Shlaer 和 Steve Mellor以信息模型化方法作为基础

9、,并为目标系统增设了状态模型和过程模型; Peter Coad 和 Ed Yourdon则在信息模型化、面向对象的程序设计语言和基于知识的系统的基础上,建立了他们的OOA和OOD,主要工具是类与对象图、对象状态图和服务图;HP公司的Fusion开发方法。面向对象资料28Jim RumbaughGrady BoochIvar Jacobson面向对象资料29lOOA和OOD是面向对象方法学中重要的部分,UML是具体的方法lOOP涉及到具体的编程语言,C+l开发要使用合适的工具IDE:Visual C面向对象资料30封装(Encapsulation)通过定义类实现继承(Inheritance)通过

10、派生新类实现多态性(Morphism)虚拟函数实现面向对象资料lXO(X?-Oriented)lSO(Service-Oriented)lOO(对象、类)lPO(过程、函数、变量)OO之后是什么?面向对象资料32第一章 C+基础面向对象资料33lC C语言语言19721972年年,由,由Dennis RitchieDennis Ritchie设计,可以设计,可以认为是最优影响力的发明之一。认为是最优影响力的发明之一。l为为改进改进C C语言语言,“带类的带类的C”,1983C”,1983命名为命名为C+C+对对C C的类型系统改进和扩充的类型系统改进和扩充( (更安全更安全) )支持面向对象支

11、持面向对象lC+C+保持与保持与C C兼容兼容( (快速普及快速普及) )lC+C+不是纯粹的面向对象的语言不是纯粹的面向对象的语言面向对象资料34面向对象资料35l关键字关键字l各种常量各种常量l操作符操作符l标识符标识符l分隔符分隔符面向对象资料36面向对象资料37l注释注释l输入和输出输入和输出l函数函数l变量(对象)变量(对象)l符号常量符号常量l表达式表达式l语句语句面向对象资料38面向对象资料39l基本语法如下:数据类型 标识符1,标识符2,。标识符n;l初始化数据类型 标识符1(初始值1),标识符2(初始值2),。标识符n(初始值n);数据类型 标识符1=初始值1,标识符2=初始

12、值2,。标识符n=初始值n;l赋值I=10;面向对象资料40l整数常量整数常量l浮点常量浮点常量l字符常量字符常量l字符串常量字符串常量l布尔常量布尔常量面向对象资料41l定义:定义:通过枚举一个类型的值域来定义一个数据类通过枚举一个类型的值域来定义一个数据类型,值域是通过在枚举声明时所指定的一组型,值域是通过在枚举声明时所指定的一组文字量(又称枚举常量)指定的。文字量(又称枚举常量)指定的。l语法形式:语法形式:enum enum 标识符标识符 标识符标识符1 1,标识符,标识符2 2,标识符,标识符3 3,。标识符,。标识符n;n;面向对象资料42l表达式由操作数和操作符组成,操作符分:表

13、达式由操作数和操作符组成,操作符分:算术操作符算术操作符:+ +、- -、* *、/ /、% %、+、-关系操作符关系操作符: 、 =、=、!=!=逻辑操作符逻辑操作符:&、|、! !逗号表达式逗号表达式:?:?:sizeofsizeof操作符操作符:sizeofsizeof位操作符位操作符:& &、| |、 赋值操作符赋值操作符:= =面向对象资料43l隐含地从一种类型向另一种类型的值的隐含地从一种类型向另一种类型的值的映射。映射。l赋值类型强制赋值类型强制右边的表达式类型映射成左值的类型。右边的表达式类型映射成左值的类型。l强制类型转换强制类型转换static_ca

14、st(E)static_cast(E)T(E)T(E)(T)E(T)E面向对象资料44l顺序结构顺序结构表达式语句表达式语句空语句空语句块语句块语句l选择结构选择结构l循环结构循环结构面向对象资料45lififlif-elseif-else及其嵌套及其嵌套lswitchcaseswitchcase面向对象资料46lwhilewhileldowhiledowhilelf foror面向对象资料47循环是可以嵌套的面向对象资料48lgotogotolbreakbreaklcontinuecontinue面向对象资料49面向对象资料50l完成特定功能的一段代码完成特定功能的一段代码具有合法的名称具有

15、合法的名称具有一定返回类型具有一定返回类型可以多次调用可以多次调用l基本形式:基本形式:返回类型返回类型 函数名(形式参数函数名(形式参数1 1,形式参数形式参数2 2,。,形式参数,。,形式参数n)n) 函数体;函数体; 面向对象资料51l值调用值调用l地址调用地址调用l引用调用引用调用l参数的求值顺序参数的求值顺序#include double Volume(double radius,double height);int main()double v;v=Volume(3.0,3.0);coutVolume=vendl;return 0;double Volume(double radi

16、us,double height)double result=3.14 * radius * radius * height;return result;面向对象资料52l具有相同函数名,但其参数个数不同或参数类型不同的一组函数称为重载。面向对象资料53l函数声明中可以为一个或多个参数指定缺省参数值。具有缺省值的参数右边不能出现没有缺省值的参数。重载函数的参数具有缺省值时要注意。例:lvoid fun(int x,int y=0)lvoid fun(int x)面向对象资料544.1类的结构lC+的类是对象的抽象数据成员。成员函数。lC+类的说明第二部分 C+语法概要面向对象资料55举例:Cl

17、ass Rectangle public: Rectangle(int x,int y,int w,int h); void Move(int x,int y); void Size(int w,int h); void Where(int& x,int& y); int Area(); void Draw(); private: int X,Y,W,H; ; 4.1类的结构(外部说明)面向对象资料56l访问控制描述符public后声明的是公有数据成员和成员函数,可被任何程序单元引用。private后声明的是私有数据成员和成员函数,仅可被类内部引用。public和private

18、出现的顺序和次数是任意的。4.1类的结构(外部说明)面向对象资料57l类成员函数的实现4.1类的结构(内部实现)Void Rectangle:Move(int x,int y) X=x; Y=y; void Rectangle:Size(int w,int h) W=w; H=h; 面向对象资料58l一般语法:类标识符 对象标识符;l可以声明多个对象,对象之间代码共享,数据独立。l可使用对象名引用对象的公有成员函数。方法如下:对象名.成员函数名(参数列表);面向对象资料59l成员函数所操作的数据成员是该类的某个对象的数据成员。面向对象资料604.2类的实例化-对象的实现面向对象资料61l构造函

19、数的作用是在对象被创建时使用特定的值构造对象(初始化)。l析构函数的作用是在对象被删除时做一些清理工作。l构造函数与类同名。l析构函数是类名前加l两者无返回类型,析构函数无参数。面向对象资料62#include class Location public: Location(int x,int y); Location(); int GetX(); int GetY(); private: int X,Y; ; 举例面向对象资料63Location:Location(int x,int y) X=x; Y=y; Location:Location() cout”Destructor calle

20、d.”endl; int Location:GetX() return X; int Location:GetY() return Y; 面向对象资料64#include int main() Location A(10,20); /构造函数被调用 coutA.GetX()”,”A.GetY()endl; return 0; /析构函数被调用 输出结果: Constructor called 10,20 Destructor called. 面向对象资料65l函数体放在类体内。l函数体放在类体外,使用inline关键字。class Location public: void Init(int

21、x,int y) X=x;Y=y; int GetX()return X; int GetY()return Y; private: int X,Y; ; 面向对象资料66class Location public: void Init(int x,int y); int GetX(); int GetY(); private: int X,Y; ; inline Location:Init(int x,int y) X=x;Y=y; inline Location:GetX() return X; 面向对象资料67#include class Locationpublic:Location(

22、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;面向对象资料68Location:Location(int x,int y)Set(x,y);void Location:Move(int x,int y)Set(x,y);void Location:ValueX(int val)X=val;int Location:ValueX()return X;vo

23、id Location:ValueY(int val)Y=val;int Location:ValueY()return Y;void Location:Set(int x,int y)X=x;Y=y;面向对象资料69int 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=6,B.Y=2 B.ValueY(4); coutB.ValueX()B.ValueY()b; if

24、(b0) int c; /c 的 作 用 域 结 束 /a,b 的 作 用 域 结 束 面向对象资料74if(int i=f() i=2*i; else i=100; /i 的作用域结束 couti; /错误 switch(int i=f() case 1: / i 的作用域结束 couti; /错误 面向对象资料75面向对象资料76面向对象资料77l标识符是否可以引用。标识符是否可以引用。l在嵌套作用域中,内层作用域的标识符在嵌套作用域中,内层作用域的标识符优先于外层作用域的标识符。优先于外层作用域的标识符。lC+C+中,标识符必须先声明后引用,在同中,标识符必须先声明后引用,在同一作用域中

25、不能声明同样的标识符。一作用域中不能声明同样的标识符。面向对象资料78#include int I; int main() I=5; int I; I=7; cout”I=”Iendl; cout”I=”Iendl; return 0; 面向对象资料79l静态生存期静态生存期与程序的运行期相同。这种对象的存储单元相对位与程序的运行期相同。这种对象的存储单元相对位置在整个程序的运行期间不变置在整个程序的运行期间不变文件作用域或用文件作用域或用staticstatic指定。指定。若未显式指定初始值,为零。若未显式指定初始值,为零。l动态生存期动态生存期在函数内部(块作用域)声明的对象是动态生存期。

26、在函数内部(块作用域)声明的对象是动态生存期。若未显式指定初始值,为任意值。若未显式指定初始值,为任意值。面向对象资料80#include void fun(); int main() fun(); fun(); void fun() static int a=1; int I=5; a+; I+; Cout”I=”I”,a=”aendl; 面向对象资料81面向对象资料82l数据存储在局部对象中,通过参数传递机制实数据存储在局部对象中,通过参数传递机制实现函数间的数据共享。现函数间的数据共享。l数据存储在全局对象中,通过全局对象进行数数据存储在全局对象中,通过全局对象进行数据交换。据交换。l封

27、装在类中封装在类中l全局对象存在的问题全局对象存在的问题可见性无限制可见性无限制不能保证操作的合法性不能保证操作的合法性l解决上述问题的方法是类及其封装技术,相应解决上述问题的方法是类及其封装技术,相应提出静态数据成员和静态成员函数。提出静态数据成员和静态成员函数。面向对象资料83#include class Application public: static void f(); static void g(); private: static int global; ; int Application:global=0; void Application:f() global=5; voi

28、d Application:g() coutglobalendl; int main() Application:f(); Application:g(); return 0; 面向对象资料84class A public: static void f( A a); private: int x; ; void A:f(A a) coutx; /错误,静态成员函数的实现中不能直接引用类中声明的非静态成员。 couta.x; 面向对象资料85class goods public: goods(int w); goods(); int Weight(); static int TotalWeigh

29、t(); private: int weight; static int totalWeight; ; 面向对象资料86goods:goods(int w) weight=w; totalWeight += w; goods:goods() totalWeight -= w ; int goods:Weight() return weight; int goods:TotalWeight() return totalWeight; 面向对象资料87面向对象资料88面向对象资料89l指针:对象的地址指针:对象的地址l指针对象:存放指针的对象指针对象:存放指针的对象l声明指针对象的语法:声明指针对

30、象的语法:T T * *标识符;标识符;int int * *pointer;pointer;l一个指针对象被赋值为一个对象的地址一个指针对象被赋值为一个对象的地址后,称指针指向对象。后,称指针指向对象。面向对象资料90l& -& -取地址操作取地址操作l* * - -目标操作目标操作Int val; Int *pointer; Pointer=&val; Int *pointer(&val); *pointer =val 面向对象资料91#include void swap(double* first,double* second); int main() d

31、ouble a(12),b(22); swap(&a,&b); cout”a=”a”,b=”bendl; return 0; void swap(double * first,double* second) double temp; temp=*first; *first=*second; *second=temp; 面向对象资料92面向对象资料93面向对象资料94面向对象资料95l数组:一组类型相同的对象l声明语法:类型标识符元素个数;l数组元素可以用下标引用数组名index;l数组元素也可以用指针引用面向对象资料96l通过指针引用数组元素定义指针对象数组的地址赋值给指针对象

32、。l指针引用数组元素的方法*(pointer + n)pointern面向对象资料97l没有为数组指定显式初始值时,数组元素使用缺省值初始化,当定义对象数组时,类中必须定义一个缺省的构造函数。Int main() coutEntering mainendl; Location A2; For(int I=0;I2;I+_ AI.Move(I+10I+10); Cout”exiting main”i; int& ref=ai; ref=55; coutrefendl; return 0; 面向对象资料101int& f(int index,int a) int& r= a

33、index; retu rn r; int m ain() int a= 1 ,3 ,5 ,7 ,9 ; f(2 ,a)= 5 5 ; co u t f(2 ,a); retu rn 0 ; int& f(int index,int a) int r= aindex; retu rn r; 面向对象资料102l在程序运行中根据需要在堆内存中创建的对象,使用完成后随时被删除。l创建语法如下:T* ptr=new T(初始值列表);l删除语法如下:delete ptr;l数组对象的创建int* ptr=new int10;l数组对象的删除 delete ptr;面向对象资料103# inc

34、lu de # inclu de # inclu de “lo catio n.h” int m ain() int *ptr; try ptr= new int1 0 0 ; catch(xallo c & e) co u t ”o u t o f m em ” endl; retu rn 1 ; fo r(int i= 0 ;iPC;delete elems;elems=new intsize=s-size; for(int I=0;IelemsI; 面向对象资料105#include #include “location.h” int main() cout”Step one:”

35、endl; Location* ptr1(new Location); Delete ptr1; Cout”Step two:”endl; Ptr1=new Location(1,2); Delete ptr1; Return 0; Step one: Default constructor called. Destructor called.1,2 Step two: Constructor called.1,2 Destructor called.1,2 面向对象资料106l数组元素的类型是指针,这样的数组称指针数组。l语法:T* 标识符元素个数;面向对象资料107l多维数组可以解释为其元

36、素是多维数组的一维数组。面向对象资料108l一个成员函数被调用时,被自动传递一个隐含的参数,该参数是一个指向正被该函数操作的对象的指针,在程序中可以用this引用它,因此称其为this指针。Class Location public: Location(int xx,int yy)X=xx;Y=yy; Void Assign(Location& p); Int GetX()return X; Int GetY()return Y; Private: Int X,Y; ; void Location:Assign(Location& p) if(this!=&p) X=p

37、.X; Y=p.Y; 面向对象资料109l用内部包含子对象的类实现复杂的类l子对象的初始化面向对象资料110#include “part.h” Part:Part() val=0; cout”Default constructor of Part”endl; Part:Part(int i) val=i; cout”Constructor of Part”valendl; Part:Part() cout”Destructor of Part”valendl; void Part:Print() coutvalendl; #if !defined(_PART_H) #define_ PART_

38、H class Part public: Part(); Part(int i); Part(); void Print(); private: int val; ; 面向对象资料111#if !defined(_WHOLE_H) #define _WHOLE_H #include “part.h” class Whole public: Whole(); Whole(int I,int j,int k); Whole(); void Print(); private: Part one; Part two; Int date; ; # inclu de “w ho le.h” W ho le

39、:W ho le() date= 0 ; co u t ”D efau lt co nstru cto r o f W ho le” endl; W ho le:W ho le(int I,int j,int k):tw o (I),o ne(j),date(k) co u t ”C o nstru cto r o f W ho le” endl; W ho le:W ho le() co u t ”D estru cto r o f W ho le” endl; vo id W ho le:P rint() o ne.P rint(); tw o .P rint(); co u t date

40、 endl; 面向对象资料112#include “whole.h” int main() Whole anObject(5,6,10); /Whole anObject; AnObject.Print(); return 0; Constructor of Part5 Constructor of Part6 Constructor of Whole 6 5 10 Destructor of Whole Destructor of Part5 Destructor of Part6 面向对象资料113l当使用操作符来表达对对象的某个操作当使用操作符来表达对对象的某个操作时,可以将操作符函数声

41、明为类的成员时,可以将操作符函数声明为类的成员函数或类的友员函数。函数或类的友员函数。l操作符的参数个数、优先级、结合性和操作符的参数个数、优先级、结合性和使用语法是由使用语法是由C+C+规定的,不能被改变。规定的,不能被改变。l重载操作符的形参不能具有缺省值。重载操作符的形参不能具有缺省值。l重载操作符的返回值类型任意,但最好重载操作符的返回值类型任意,但最好不是不是void void 。面向对象资料114#include class complex public: complex(double r=0,double I=0); complex operator+(const complex

42、& c); complex operator -(const complex& c); complex operator (); void print()const; private: double real,imag; ; 面向对象资料115complex complex:operator + (const complex& c) double r=real+c.real; double I=imag+c.imag; return complex(r,I); complex complex:operator complex complex:operator (cons

43、t complex& c) (const complex& c) double r=realdouble r=real- -c.real;c.real; double double I I=imag=imag- -c.imag;c.imag; return complex(r,return complex(r,I I);); Complex:complex(double r,double I) real=r;imag=I; complex complex:operator + (const complex& c) double r=real+c.real; double

44、 I=imag+c.imag; return complex(r,I); complex complex:operator (const complex& c) double r=real-c.real; double I=imag-c.imag; return complex(r,I); 面向对象资料116complex complex:operator () return complex(-real,-imag); void complex:print()const cout”(“real”,”imag”)”endl; 面向对象资料117int main() complex c1(

45、2.5,3.7),c2(4.2,6.5); complexc ; c=c1-c2; /c1.operator (c2) c.print(); c=c1+c2; /c1.operator +(c2) c.print(); c=-c1; /c1.operator () c.print(); return 0; 面向对象资料118#include class complex public: complex(double r=0,double I=0); friend complex operator+(const complex& c1,const complex& c2); fri

46、end complex operator -(const complex& c1,const complex& c2); friend complex operator (const complex& c); void print()const; private: double real,imag; ; 面向对象资料119Complex:complex(double r,double I) real=r;imag=I; complex complex:operator + (const complex& c1,const complex& c2) dou

47、ble r=c1.real+c2.real; double I=c1.imag+c2.imag; return complex(r,I); complex complex:operator (const complex& c1,const complex& c2) double r=c1,real-c2.real; double I=c1.imag-c2.imag; return complex(r,I); 面向对象资料120complex complex:operator (const complex& c) return complex(-c.real,-c.ima

48、g); void complex:print()const cout”(“real”,”imag”)”endl; 面向对象资料121int main() complex c1(2.5,3.7),c2(4.2,6.5); complexc ; c=c1-c2; /operator (c1,c2) c.print(); c=c1+c2; /operator + (c1,c2) c.print(); c=-c1; /operator (c1) c.print(); return 0; 面向对象资料122l一元函数最好重载为成员函数一元函数最好重载为成员函数l二元函数一般重载为友元函数二元函数一般重载

49、为友元函数27.5+27.5+x xl赋值操作符只能重载为成员函数赋值操作符只能重载为成员函数27.5=27.5=x xl+和和-操作符有两种形式,一般被重载操作符有两种形式,一般被重载为成员函数为成员函数其中后缀操作重载后带有一个整型参数。其中后缀操作重载后带有一个整型参数。面向对象资料123l下标操作符只能被重载为成员函数下标操作符只能被重载为成员函数l函数调用操作符可以看作是下标操作符函数调用操作符可以看作是下标操作符的扩展的扩展面向对象资料124l通过已有的类进行扩展产生新类的过程通过已有的类进行扩展产生新类的过程l产生的新类称派生类产生的新类称派生类l产生派生类的类称基类或父类。产生

50、派生类的类称基类或父类。l从一个基类派生称单基继承,从多个基从一个基类派生称单基继承,从多个基类派生称多基继承。类派生称多基继承。面向对象资料125Mouse ScreenDeviceKeyboardTreeAppleTreeFruit面向对象资料126单基继承的语法 class 派生类名:访问控制 基类名 数据成员和成员函数声明; 多基继承的语法 class 派生类名:访问控制 基类名1,访问控制 基类名2 数据成员和成员函数声明; 面向对象资料127l访问控制用于控制基类中声明的名字在多大的范围内能够被派生类的用户访问l访问控制有三种public,protected,private基类模块

51、派生类模块间接派生类模块其他程序模块面向对象资料128Class Location Public: Void InitL(int xx,int yy); Void Move(int xOff,int yOff); Int GetX()return X; Int GetY()return Y; Private: Int X,Y; ; void Location:InitL(int xx,int yy) X=xx; Y=yy; void Location:Move(int xOff,int yOff) X+=xOff; Y+=yOff; Class Rectangle:public Locatio

52、n Public: Void InitR(int x,int y,int w,int h); Int GetW()return W; Int GetH()return H; Private: Int W,H; ; void Rectangle:InitR(int x,int y,int w,int h) InitL(x,y); W=w; H=h; 面向对象资料129#include int main() Rectangle rect; Rect.InitR(2,3,20,10); Rect.Move(3,2); Coutrect.GetX()”,” rect.GetY()”,” rect.Ge

53、tW()”,” rect.GetH()endl; return 0; 面向对象资料130Class Rectangle:private Location Public: Void InitR(int x,int y,int w,int h); Void Move(int xOff,int yOff); Int GetX()return Location:GetX(); Int GetY()return Location:GetY(); Int GetW()return W; Int GetH()return H; Private: Int W,H; ; void Rectangle:InitR

54、(int x,int y,int w,int h) InitL(x,y); W=w; H=h; void Rectangle:Move(int xOff,int yOff) Location:Move(xOff,yOff); 面向对象资料131Class V:public Rectangle Public: Void Function(); ; void V:Function() Move(3,2); int main() Rectangle rect; Rect.Move(3,2); 面向对象资料132l对V模块是publicl对H模块是privateClass A Protected: I

55、nt X; int main() A a; a.X=5; /错错误误 class B:public A public: void Function(); void B:Function() X=5; 面向对象资料133l可以将其视为单继承来考察,每个基类与派生类的关系可以当做单基继承。面向对象资料134l派生类的数据成员由属于基类的部分和属于自己的部分组成,属于基类的部分初始化应由基类的构造函数完成。l构造函数不被继承,派生类必须调用基类的构造函数来初始化属于基类的部分数据成员。l一般形式如下:C:C(参数表0):C1(参数表1),C2(参数表2),Cn(参数表n)面向对象资料135l如果冒号

56、右边的某个基类的构造函数参数表为空,则可以省略该项。l构造对象时,先执行基类的构造函数,然后执行派生类的构造函数。析构时则相反。l多基继承时基类构造函数的执行顺序由继承时的顺序决定(从左向右),与初始化列表中的顺序无关。面向对象资料136#include class B public: B(); B(int I); B(); void Print() const; private: int b; ; B:B() b=0; cout”Bs default constructor called.”endl; B:B(int I) b=I; cout”Bs constructor called.”e

57、ndl; B:B() cout”Bs destructor called.”endl; void B:Print() const coutbendl; 面向对象资料137class C:public B public: C(); C(int I,int j); C(); void Print() const; private: int c; ; C:C() c=0; cout”Cs default constructor called.”endl; C:C(int I,int j):B(i) c=j; cout”Cs constructor called.”endl; C:C() cout”C

58、s destructor called.”endl; void C:Print() const B:Print(); coutcendl; 面向对象资料138Int main() C obj(5,6); Obj.Print(); Return 0; Bs constructor called. Cs constructor called. 5 6 Cs destructor called. Bs destructor called. 面向对象资料139l如果派生类的一个表达式引用基类中不止一个成员,则存在二义性。l解决二义性的办法是加类限定符。面向对象资料140class A public:

59、void f(); class B public: void f(); void g(); class C:public A,public B public: void g(); void h(); ; C obj; obj.f(); /是是 A 的的 f()或或 B 的的 f()? 解决的办法是在类解决的办法是在类 C 中定义一个中定义一个 f()成员函数成员函数 void C:f() A:f(); 或或 B:f(); 面向对象资料141l如果一个派生类是从多个基类派生,而这些基类又有一个共同的基类,则在对该基类中声明的标识符进行访问时可能产生二义性。class B public: int

60、b; class B1:public B private: int b1; class B2:public B private: int b2; class C:public B1,public B2 public: int f(); private: int d; 面向对象资料142BbB1b1Cf(),dBbB2b2面向对象资料143C c; c.b; /错错 c.B:b ;/错错 c.B1:b;/对对 c.B2:b; /对对 int main() C c; c.B1:b=5; c.B2:b=10; cout”path B1”c.B1:bendl; cout”path B2”c.B2:bendl; return 0; 面向对象资料144l为避免一个基类在多条继承路径上造成在派生类中产生多个基类子对象,可以采用虚基类技术。l语法如下class B1:virtual public Bclass B2:virtual public Bclass C:public B1,public B

温馨提示

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

评论

0/150

提交评论