《(精品)c++面向对象程序设计 (2).ppt》由会员分享,可在线阅读,更多相关《(精品)c++面向对象程序设计 (2).ppt(417页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象的设计思想 面面向向对对象象的的思思想想最最初初出出现现于于挪挪威威奥奥斯斯陆陆大大学学和和挪挪威威计计算算机机中中心心共共同同研研制制的的Simula 67语语言言中中,随随着着的的Smalltalk-76和和8080语语言言推推出出,面面向向对对象象的的的的程程序序设设计计方法得到了比较完善的实现。方法得到了比较完善的实现。此此后后,面面向向对对象象的的概概念念和和应应用用已已超超越越了了程程序序设设计计和和软软件件开开发发,扩扩展展到到如如数数据据库库系系统统,交交互互式式界界面面,分分布式系统,网络管理结构和人工智能等领域。布式系统,网络管理结构和人工智能等领域。面向对象的发展
2、面向对象面向对象思想思想数据抽象数据抽象 一种设计方法一种设计方法 把一组数据及作用与其上的操作组成一把一组数据及作用与其上的操作组成一个设计实体或单位。接口说明外部可见,其个设计实体或单位。接口说明外部可见,其实现是隐蔽的,不可见的。实现是隐蔽的,不可见的。发展的三个阶段发展的三个阶段01010101100100IntegerRealBoolean用户用户定义定义抽象数抽象数据类型据类型面向对象面向对象思想思想抽象数据类型抽象数据类型 抽象数据类型是指抽象数据类型是指“一个值集和作用在一个值集和作用在该值集上的操作集该值集上的操作集”。抽象数据类型的定义。抽象数据类型的定义只决定于其逻辑特性
3、,与其具体的计算机内只决定于其逻辑特性,与其具体的计算机内部实现无关。一个抽象数据类型可以分解为部实现无关。一个抽象数据类型可以分解为语法、语义、表示和算法语法、语义、表示和算法4个部分。个部分。功能抽象功能抽象模块模块数据抽象数据抽象模块模块面向对象面向对象思想思想抽象数据类型的实现抽象数据类型的实现实现抽象数据类型需要借助于高级程序设计语实现抽象数据类型需要借助于高级程序设计语言言;在面向过程的语言中,用户可以自己定义数据在面向过程的语言中,用户可以自己定义数据类型类型;在面向对象的程序设计语言中,借助于对象描在面向对象的程序设计语言中,借助于对象描述抽象数据类型。述抽象数据类型。(Cla
4、ss)面向对象面向对象思想思想问题求解问题求解面向对象设计方法:实现问题空间和问题求解面向对象设计方法:实现问题空间和问题求解空间的近似和直接模拟。空间的近似和直接模拟。意识部分意识部分教室教室物质部分物质部分303303教室教室抽象部分抽象部分教室类教室类具体部分具体部分一个对象:教室实例一个对象:教室实例现实问题空间现实问题空间解空间解空间面向对象的特点面向对象的特点封装机制封装机制基于消息的通信基于消息的通信继承机制继承机制多态机制多态机制 理解面向对象的基本概念对于学习和掌握面向理解面向对象的基本概念对于学习和掌握面向对象的开发方法是十分重要的。对象的开发方法是十分重要的。面向对象的基
5、本概念 类类(ClassClass)对象对象(Object)Object)实例实例(Instance)Instance)多态性多态性多态性多态性(Polymorphism)Polymorphism)继承继承(InheritanceInheritance)消息消息(Message)Message)封装封装(Encapsulation)(Encapsulation)面向对象的世界观面向对象的世界观把客观世界从概念上看成是一个由相互配合而协把客观世界从概念上看成是一个由相互配合而协作的对象所组成的系统作的对象所组成的系统面向对象面向对象=对象对象+分类分类+继承继承+通信通信一个实例一个实例椅子椅子
6、对象:桌子对象:桌子价格价格尺寸尺寸重量重量位置位置颜色颜色类:家具类:家具对象:椅子对象:椅子一个面向对象的实例一个面向对象的实例椅子椅子价格价格尺寸尺寸重量重量位置位置颜色颜色买卖移动买买卖卖移动移动买买卖卖移动移动价格价格尺寸尺寸重量重量位置位置颜色颜色对象对象对象对象(Object)Object)对象是用来描述客观存在的事物,它是构成系对象是用来描述客观存在的事物,它是构成系统的基本单位,是对客观世界中事物的抽象统的基本单位,是对客观世界中事物的抽象描述。描述。对象对象 行为(功能、方法、服务)行为(功能、方法、服务)属性(数据)属性(数据)属性属性行为行为接口接口对象对象对象对象对象
7、对象面向对象的基本概念面向对象的基本概念对象是由私有数据(属性)及作用于其上的一组操作(行对象是由私有数据(属性)及作用于其上的一组操作(行为)所构成的一个封闭整体为)所构成的一个封闭整体由于对象的数据是私有的,所以要想访问其数据的正确方法是向该对象发送消息,让对象自身选择其内部相应的操作以完成对该项数据的访问对象的动作取决于外界给对象的刺激,这就是消息,消息告诉对象所要求它完成的功能。对象具有一定的智能功能,即“知道”如何选择相应的操作来处理对象所接收的消息从设计人员的角度看,对象是一个完成特定功能的程序块从设计人员的角度看,对象是一个完成特定功能的程序块从用户的角度看,对象为他们提供了所希
8、望的行为从用户的角度看,对象为他们提供了所希望的行为面向对象的基本概念面向对象的基本概念对象对象(Object)对象标识对象标识对象生命周期对象生命周期面向对象的基本概念面向对象的基本概念类(类(类(类(ClassClass)类类又又称称对对象象类类(Object Object ClassClass),是是是是一一组组具具有有相相同属性和相同操作的对象的集合。同属性和相同操作的对象的集合。在在一一个个类类中中,每每个个对对象象都都是是类类的的实实例例(instance),它们都可以使用类中提供的函数。,它们都可以使用类中提供的函数。类具有属性类具有属性,用数据结构来描述类的属性,用数据结构来描
9、述类的属性,类类具具有有操操作作,它它是是对对象象的的行行为为的的抽抽象象,操操作作实实现现的的过过程程称称为为方方法法(method),方方法法有有方方法法名名,方方法法体体和参数。和参数。由于对象是类的实例,在进行分析和设计时,由于对象是类的实例,在进行分析和设计时,由于对象是类的实例,在进行分析和设计时,由于对象是类的实例,在进行分析和设计时,通常把注意力集中在类上,而不是具体的对象上。通常把注意力集中在类上,而不是具体的对象上。通常把注意力集中在类上,而不是具体的对象上。通常把注意力集中在类上,而不是具体的对象上。几何对象几何对象颜色颜色位置位置移动(移动(delta:矢量)矢量)选择
10、(选择(P:指针型)指针型):布尔型布尔型旋转旋转(角度角度)图1 对象类的描述人人姓姓 名名:字符串字符串年年 龄龄:整整 型型改换工作改换工作改换地址改换地址文件文件文件名文件名文件大小文件大小最近更新日期最近更新日期打印打印(人人)张红兵张红兵28绘图员绘图员人民路人民路8号号(人人)李军李军24程序员程序员无无图2 对象的描述对象和类的描述对象和类的描述对象和类的描述对象和类的描述类类类类和和和和对对对对象象象象一一一一般般般般采采采采用用用用“名名名名字字字字”、“属属属属性性性性”和和和和“运运运运算算算算”来来来来描描描描述。述。述。述。类名类名属性属性运算运算 对象对象 类类属
11、于某类的具体对象就是该类的属于某类的具体对象就是该类的实例实例。一个类的不同实例必定具有:一个类的不同实例必定具有:相同的操作(或行为)的集合相同的操作(或行为)的集合相同的信息结构或属性定义,但可以有不同的属性值相同的信息结构或属性定义,但可以有不同的属性值不同的对象标识不同的对象标识面向对象的基本概念面向对象的基本概念面向对象的基本概念面向对象的基本概念消息消息(Message)对象之间的联系是通过传递消息来实现的。对象之间的联系是通过传递消息来实现的。消息消息就是向对象发出的服务请求(互相联系、就是向对象发出的服务请求(互相联系、协同工作等)。协同工作等)。是对象之间进行通讯的一种数据结
12、构。是对象之间进行通讯的一种数据结构。消息统一了消息统一了“数据流数据流”和和“控制流控制流”。数据数据方法方法消息到达面向对象的基本概念面向对象的基本概念消息消息-消息传送与函数调用的区别消息传送与函数调用的区别(1)函数调用可以带或不带参数,但是消息至)函数调用可以带或不带参数,但是消息至少带一个参数,它表明接收该消息的对象,消少带一个参数,它表明接收该消息的对象,消息中告诉对象做什么的部分称为消息操作;息中告诉对象做什么的部分称为消息操作;(2)消息操作名类似于函数名,其本质区别在)消息操作名类似于函数名,其本质区别在于:函数名代表一段可执行的代码,但消息操于:函数名代表一段可执行的代码
13、,但消息操作名具体功能的选定还取决于接收消息的对象作名具体功能的选定还取决于接收消息的对象本身本身(3)函数调用是过程式的(如何做),消息传)函数调用是过程式的(如何做),消息传送是说明式的(做什么),具体如何做,由对送是说明式的(做什么),具体如何做,由对象根据收到的消息自行确定。象根据收到的消息自行确定。继承继承继承继承 (InheritanceInheritance)继继承承是是使使用用现现存存的的定定义义作作为为基基础础,建建立立新新定定义义的的技技术术。是是父父类类和和子子类类之之间间共共享享数数据据结结构构和和方方法法的的机机制制,这是类之间的一种关系。这是类之间的一种关系。继承性
14、分:继承性分:单单重重继继承承:一一个个子子类类只只有有一一个个父父类类。即即子子类类只只继继承承一个父类的数据结构和方法。一个父类的数据结构和方法。多多重重继继承承:一一个个子子类类可可有有多多个个父父类类。继继承承多多个个父父类类的数据结构和方法。的数据结构和方法。基类基类子类子类A子类子类B图 4 继承性描述现存类定义现存类定义父类父类(基类基类)新类定义新类定义子类子类(派生类派生类)继继 承承图 3 继承性继承继承单继承单继承CheckingSavingsSuperclass(parent)SubclassesInheritance RelationshipAncestorDesce
15、ndents继承继承多继承多继承Use multiple inheritance only when needed and always with caution!Multiple Inheritance封装封装(Encapsulation)封封装装是是一一种种信信息息隐隐蔽蔽技技术术,就就是是把把对对象象的的属属性性和和行行为为相相结结合合构构成成一一个个独独立立的的基基本本单单位位,用用户户只只能能见见到到对对象象封封装装界界面面上上的的信信息息,对对象象内内部部对对用用户户是是隐隐蔽蔽的的。封封装装的的目目的的在在于于将将对对象象的的使使用用者者和和对对象象的的设设计计者者分分开开,使使
16、用用者者不不必必知知道道行行为为实实现现的的细细节节,只只需需使使用用设设计计者提供的消息访问对象者提供的消息访问对象面向对象的基本概念面向对象的基本概念 封装是把过程和数据包围起来,对数据的封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面。访问只能通过已定义的界面。面向对象的基本概念面向对象的基本概念PosColor 公有公有消息消息私有私有消息消息存储结构方法协.议一个对象面向对象的基本概念面向对象的基本概念封装的定义为:封装的定义为:(1)一个限定所有对象内部软件的一个清楚界面;一个限定所有对象内部软件的一个清楚界面;(2)一个描述这个对象和其它对象之间相互作用的接口一个描述
17、这个对象和其它对象之间相互作用的接口(3)受保护的内部实现,这个实现给出了由软件对象提受保护的内部实现,这个实现给出了由软件对象提供的功能细节,实现细节不能在定义这个对象的类的供的功能细节,实现细节不能在定义这个对象的类的外面访问外面访问封装封装 vs 继承继承矛盾吗?矛盾吗?No!封装性主要指的是对象的封装性,引入继承机制封装性主要指的是对象的封装性,引入继承机制后,对象仍然是封装地很好的实体,其它对象后,对象仍然是封装地很好的实体,其它对象与它通信只能发送消息。与它通信只能发送消息。相似性:共享代码!相似性:共享代码!继承:静态共享代码封装:动态共享代码面向对象的基本概念面向对象的基本概念
18、多态多态(Polymorphism)即一个即一个名字具有多种语义名字具有多种语义。同一对象接收到不同消息采用不同的行为方式同一对象接收到不同消息采用不同的行为方式不同对象收到相同消息时产生不同的动作不同对象收到相同消息时产生不同的动作重载(重载(overload)动态绑定动态绑定类属类属多态性和动态绑定多态性和动态绑定多态性和动态绑定多态性和动态绑定 多多多多态态态态性性性性(Polymorphism)Polymorphism)是是是是指指指指相相相相同同同同的的的的操操操操作作作作或或或或函函函函数数数数、过程作用于不同的对象上并获得不同的结果。过程作用于不同的对象上并获得不同的结果。过程作
19、用于不同的对象上并获得不同的结果。过程作用于不同的对象上并获得不同的结果。即即即即相相相相同同同同的的的的操操操操作作作作的的的的消消消消息息息息发发发发送送送送给给给给不不不不同同同同的的的的对对对对象象象象时时时时,每每每每个个个个对对对对象象象象将将将将根根根根据据据据自自自自己己己己所所所所属属属属类类类类中中中中定定定定义义义义的的的的操操操操作作作作去去去去执执执执行行行行,产产产产生生生生不不不不同的结果。同的结果。同的结果。同的结果。例例如如:“绘绘图图”操操作作,作作用用在在“椭椭圆圆”和和“矩矩形形”上上,画出不同的图形。画出不同的图形。动动动动态态态态绑绑绑绑定定定定(d
20、ynamic dynamic binding)binding)是是是是在在在在运运运运行行行行时时时时根根根根据据据据对对对对象象象象接收的消息动态地确定要连接的服务代码。接收的消息动态地确定要连接的服务代码。接收的消息动态地确定要连接的服务代码。接收的消息动态地确定要连接的服务代码。使使用用虚虚函函数数可可实实现现动动态态联联编编,不不同同联联编编可可以以选选择择不同的实现,这便是多态性。不同的实现,这便是多态性。继继承承是是动动态态联联编编的的基基础础,虚虚函函数数是是动动态态联联编编的的关关键。键。多态性的实现举例多态性的实现举例 实现多态性的基本步骤实现多态性的基本步骤实现多态性的基本
21、步骤实现多态性的基本步骤(以以以以C+C+为例为例为例为例):(1)1)在基类中,定义成员函数为虚函数在基类中,定义成员函数为虚函数(virtual);(2)(2)定义基类的公有定义基类的公有(public)派生类;派生类;(3)(3)在基类的公有派生类中在基类的公有派生类中“重载重载”该虚函数;该虚函数;(4)(4)定定义义指指向向基基类类的的指指针针变变量量,它它指指向向基基类类的的公公有派生类的对象。有派生类的对象。注注注注意意意意:重重载载虚虚函函数数不不是是一一般般的的重重载载函函数数,它它要要求求函函数数名、返回类型、参数个数、参数类型和顺序完全相同。名、返回类型、参数个数、参数类
22、型和顺序完全相同。多态多态figureCircleTriangleSquarearea()area()area()area()类与对象类与对象C+语言程序设计C+语言程序设计本章主要内容本章主要内容l面向对象的思想面向对象的思想lOOP的基本特点的基本特点l类概念和声明类概念和声明l对象对象l构造函数构造函数l析构函数析构函数l内联成员函数内联成员函数l拷贝构造函数拷贝构造函数l类的组合类的组合C+语言程序设计回顾:面向过程的设计方法回顾:面向过程的设计方法l重点重点:如何实现细节过程,将数据与函数分开。l形式:形式:主模块+若干个子模块(main()+子函数)。l特点:特点:自顶向下,逐步求
23、精功能分解。l缺点:缺点:效率低,程序的可重用性差。面向对象的思想C+语言程序设计面向对象的方法面向对象的方法l目的:目的:实现软件设计的产业化。l观点观点:解决问题属于自然界的。解决问题属于自然界的。自然界是由实体(对象)所组成。l程序设计方法:程序设计方法:使用面向对象的观点来描述模仿并处理现实问题。l要求:要求:高度概括、分类、和抽象。面向对象的思想C+语言程序设计(1)抽象)抽象抽象是对具体对象(问题)进行概括,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述抽出这一类对象的公共性质并加以描述的过程。(如学生,教师的过程。(如学生,教师,课程)课程)先注意问题的本质
24、及描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。行为抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的声明。OOP的基本特点C+语言程序设计抽象实例抽象实例钟表钟表l数据抽象:数据抽象:int Hour,int Minute,int Secondl行为抽象:行为抽象:SetTime(),ShowTime()OOP的基本特点C+语言程序设计抽象实例抽象实例钟表类钟表类class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:in
25、t Hour,Minute,Second;OOP的基本特点C+语言程序设计抽象实例抽象实例人人l数据抽象:数据抽象:char*name,char*sex,int age,int idl行为抽象:行为抽象:生物属性角度:GetCloth(),Eat(),社会属性角度:Work(),Promote(),注意:同一个问题可能有不同的抽象结果:根据解决问题的要求不同,产生的抽象成员可能不同OOP的基本特点C+语言程序设计(2)封装封装将抽象出的数据成员、行为成员相结将抽象出的数据成员、行为成员相结合,将它们视为一个整体,即类。合,将它们视为一个整体,即类。目的是增强安全性和简化编程,使用者不必了解具体
26、的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:类声明中的OOP的基本特点C+语言程序设计封装封装l实例:实例:class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;边界特定的访问权限OOP的基本特点外部接口C+语言程序设计(3)继承与派生继承与派生为了重用引出了继函的概念。为了重用引出了继函的概念。是是C+中支持层次分类的一种机制,允许程序员中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进
27、行更具体的说明。在保持原有类特性的基础上,进行更具体的说明。实现:声明派生类实现:声明派生类第第11章章昆虫的分类树昆虫的分类树OOP的基本特点C+语言程序设计多态性多态性l多态:同一名称,不同的功能实现方式。多态:同一名称,不同的功能实现方式。l目的:达到行为标识统一,减少程序中标目的:达到行为标识统一,减少程序中标识符的个数。识符的个数。l实现:重载函数和虚函数实现:重载函数和虚函数第第12章章OOP的基本特点C+语言程序设计c+中的类中的类l类是具有相同属性和行为的一组对象类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提的集合,它为属于该类的全部对象提供了统一的抽象描述,
28、其内部包括属供了统一的抽象描述,其内部包括属性和行为两个主要部分。性和行为两个主要部分。l利用类可以实现数据的封装、隐藏、利用类可以实现数据的封装、隐藏、继承与派生。继承与派生。l利用类易于编写大型复杂程序,其模利用类易于编写大型复杂程序,其模块化程度比块化程度比C中采用函数更高。中采用函数更高。类 和 对 象C+语言程序设计类与函数类与函数l函数是将逻辑上相关的函数是将逻辑上相关的语句与数据语句与数据封封装,用于完成特定的功能。装,用于完成特定的功能。l而类则是逻辑上相关的而类则是逻辑上相关的函数与数据函数与数据的的封装,它是对所要处理的问题的描述。封装,它是对所要处理的问题的描述。类 和
29、对 象C+语言程序设计类的声明形式类的声明形式 类是一种用户自定义类型,声明形式:类是一种用户自定义类型,声明形式:class 类名称 public:公有成员(外部接口)private:私有成员 protected:保护型成员类 和 对 象C+语言程序设计公有类型成员公有类型成员在关键字在关键字public后面声明,它们是类后面声明,它们是类与外部的接口,任何外部函数都可以访与外部的接口,任何外部函数都可以访问公有类型数据和函数。问公有类型数据和函数。类 和 对 象C+语言程序设计私有类型成员私有类型成员在关键字在关键字private后面声明,后面声明,只允许只允许本类中的函数访问,而类外部的
30、任何函本类中的函数访问,而类外部的任何函数都不能访问。数都不能访问。如果如果紧跟在类名称的后面声明私有成员,紧跟在类名称的后面声明私有成员,则则关键字关键字privateprivate可以可以省略。省略。类 和 对 象C+语言程序设计保护类型保护类型与与private类似,其差别表现在继承与类似,其差别表现在继承与派生时对派生类的影响不同,派生时对派生类的影响不同,第七章讲第七章讲。类 和 对 象C+语言程序设计类的成员类的成员class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:
31、int Hour,Minute,Second;类 和 对 象成员数据成员函数void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute:Second;19C+语言程序设计成员数据成员数据l与一般的变量声明相同,但需要将它放在类的声明与一般的变量声明相同,但需要将它放在类的声明体中。体中。lclass complex private:double real;double imag;public:void init(doubl
32、e r,double i)real=r;imag=i;double realcomplex()return real;double imagcomplex()return imag;double abscomplex()double t;t=real*real+imag*imag;return sqrt(t);类 和 对 象C+语言程序设计成员函数成员函数l在类中说明原形,可以在在类中说明原形,可以在类外给出函数类外给出函数体实现,并在函数名前使用类名加以限体实现,并在函数名前使用类名加以限定。定。也可以也可以直接在类中给出函数体,形直接在类中给出函数体,形成内联成员函数成内联成员函数。l允许
33、声明重载函数和带默认形参值的函允许声明重载函数和带默认形参值的函数数类 和 对 象C+语言程序设计带缺省形参值的函数带缺省形参值的函数lVoid clock:setTime(int NewH=0,int NewM=0,int NewS=0)Hour=NewH;Minute=NewM;Second=NewS;C+语言程序设计内联成员函数内联成员函数l为了提高运行时的效率,对于较简单为了提高运行时的效率,对于较简单的函数可以声明为内联形式。的函数可以声明为内联形式。l内联函数体中不要有复杂结构(如循内联函数体中不要有复杂结构(如循环语句和环语句和switch语句)。语句)。l在类中声明内联成员函数
34、的方式:在类中声明内联成员函数的方式:将函数体放在类的声明中-隐式使用inline关键字-显式类 和 对 象C+语言程序设计内联成员函数举例内联成员函数举例(隐式隐式)class Point public:void Init(int initX,int initY)X=initX;Y=initY;int GetX()return X;int GetY()return Y;private:int X,Y;类 和 对 象C+语言程序设计内联成员函数举例内联成员函数举例(显式显式)class Point public:void Init(int initX,int initY);int GetX()
35、;int GetY();private:int X,Y;类 和 对 象inline void Point:Init(int initX,int initY)X=initX;Y=initY;inline int Point:GetX()return X;inline int Point:GetY()return Y;25C+语言程序设计对象对象l类的对象是该类的某一特定实体,即类的对象是该类的某一特定实体,即类类型的变量。类类型的变量。l声明形式:声明形式:类名类名 对象名;对象名;l例:例:Clock myClock;类 和 对 象C+语言程序设计类中成员的访问方式类中成员的访问方式l类中成员
36、互访类中成员互访直接使用成员名l类外访问类外访问使用“对象名.成员名”方式访问 public 属性的成员类 和 对 象C+语言程序设计例例 类的应用举例类的应用举例#includeusing namespace std;class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;C+语
37、言程序设计void Clock:ShowTime()coutHour“:”Minute“:”Second;void main(void)Clock myClock;myClock.SetTime(8,30,30);myClock.ShowTime();例例 类的应用举例类的应用举例C+语言程序设计结构与类结构与类Struct Savings unsigned accountNumber;float balance;void fn()Savings a;Savings b;a.accountNumber=1;b.accountNumber=2;结构与类的区别:类中成员的缺省存储属性为私有的结构体
38、中的缺省存储属性为共有的C+语言程序设计构造函数构造函数l由于类的封装性,不能像普通变量一样初始化由于类的封装性,不能像普通变量一样初始化struct Savingsunsigned accountNumber;float balance;Savings A=1,2000.0;Savings B(2,3000.0);构造函数和析构函数C+语言程序设计构造函数构造函数l构造函数的作用是在对象被创建时使用特定的构造函数的作用是在对象被创建时使用特定的值去构造对象,或者说将对象值去构造对象,或者说将对象初始化初始化为一个特为一个特定的状态。定的状态。l在对象创建时在对象创建时由系统自动调用由系统自动
39、调用。l如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出一个默默认形式认形式的构造函数的构造函数l允许为允许为内联内联函数、函数、重载重载函数、函数、带默认形参值带默认形参值的的函数函数构造函数和析构函数C+语言程序设计构造函数举例构造函数举例class Clockpublic:Clock(int NewH,int NewM,int NewS);/构造函数构造函数void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;构造函数和析构函数构造函数的实现:
40、构造函数的实现:Clock:Clock(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;建立对象时构造函数的作用:建立对象时构造函数的作用:void main()Clock c(0,0,0);/隐含调用构造函数,将初始值作为实参。隐含调用构造函数,将初始值作为实参。c.ShowTime();31C+语言程序设计重载构造函数:重载构造函数:/ex.h#include class Demo int x,y;public:Demo(int a,int b)x=a;y=b;cout“Constructor demo(int,in
41、t)be calledn”;Demo()cout“Constructor demo()be calledn”;void show()cout“X=”xt“Y=”yendl;C+语言程序设计#include“ex.h”void main()Demo d1(3,5);/A d1.Show();Demo d2;/B d2.Show();该程序的输出为:该程序的输出为:Constructor Demo(int,int)be calledX=3 Y=5Constructor Demo()be calledX=946 Y=928 (随机值随机值)C+语言程序设计拷贝构造函数拷贝构造函数拷贝构造函数是一种特
42、殊的构造函数,其形参为本类的对拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。象引用。作用:使用一个对象(参数指定的对象),去初始化一个作用:使用一个对象(参数指定的对象),去初始化一个正在被建立的同类型对象。正在被建立的同类型对象。class 类名 public:类名(形参);/构造函数 类名(类名&对象名);/拷贝构造函数 .;类名:类名(类名&对象名)/拷贝构造函数的实现 函数体 构造函数和析构函数C+语言程序设计例例 拷贝构造函数举例拷贝构造函数举例class Point public:Point(int xx=0,int yy=0);Point(Point&p);int G
43、etX()return X;int GetY()return Y;private:int X,Y;构造函数和析构函数Point:Point(int xx,int yy)X=xx;Y=yy;Point:Point(Point&p)X=p.X;Y=p.Y;cout拷贝构造函数被调用拷贝构造函数被调用endl;Point b(1,1);Point a(b);34C+语言程序设计拷贝构造函数被调用的时机拷贝构造函数被调用的时机l(1)当用类的一个对象去初始化该类的)当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。实现拷贝赋值。void
44、 main(void)Point A(1,2);Point B(A);/拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl;构造函数和析构函数C+语言程序设计l(2)若函数的形参为类对象,调用函)若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:用拷贝构造函数。例如:void fun1(Point p)coutp.GetX()endl;void main()Point A(1,2);fun1(A);/调用拷贝构造函数调用拷贝构造函数 构造函数和析构函数拷贝构造函数被调用的时机拷贝构造函数被调用的时机C+语言程序
45、设计l(3)当函数的返回值是类对象时,系统自)当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:动调用拷贝构造函数。例如:Point fun2()Point A(1,2);return A;/调用拷贝构造函数调用拷贝构造函数void main()Point B;B=fun2();构造函数和析构函数拷贝构造函数被调用的时机拷贝构造函数被调用的时机C+语言程序设计拷贝构造函数拷贝构造函数如果程序员没有为类声明拷贝初始化构造函数,则编译器自如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。己生成一个拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数这
46、个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。据成员的值,初始化将要建立的对象的对应数据成员。Point(Point&p)Point A(1,2);X=p.x;Point B(A);Y=p.y;B.X=A.X 如果没有定义这个函数如果没有定义这个函数 B.Y=A.Y构造函数和析构函数C+语言程序设计析构函数析构函数l完成对象被删除前的一些清理工作。完成对象被删除前的一些清理工作。l在对象的生存期结束的时刻系统自动调用它,在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。然后再释放此对象所属的空间。l如果程序中未声明析构函数,
47、编译器将自动如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。产生一个默认的析构函数。构造函数和析构函数C+语言程序设计构造函数和析构函数举例构造函数和析构函数举例#includeusing namespace std;class Point public:Point(int xx,int yy);Point();/.其它函数原形其它函数原形 private:int X,int Y;构造函数和析构函数Point:Point(int xx,int yy)X=xx;Y=yy;Point:Point()/.其它函数的实现略其它函数的实现略41C+语言程序设计#include class
48、Q int x,y;public:Q(int a=0,int b=0)cout“调用了构造函数!调用了构造函数!”endl;x=a;y=b;void P(void)coutxtyn;Q()cout“调用了析构函数!调用了析构函数!”n;void main(void)Q q(50,100);q.P();cout“退出主函数!退出主函数!n”;输出:调用了构造函数!输出:调用了构造函数!50 100 退出主函数!退出主函数!调用了析构函数!调用了析构函数!C+语言程序设计类的应用举例类的应用举例一圆型游泳池如图所示,现在需在其周围建一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅
49、栏。栅栏价格为一圆型过道,并在其四周围上栅栏。栅栏价格为35元元/米,过道造价为米,过道造价为20元元/平方米。过道宽度为平方米。过道宽度为3米,游泳池半径由键盘输入。要求编程计算并米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏的造价。输出过道和栅栏的造价。游泳池过道#include using namespace std;const float PI=3.14159;const float FencePrice=35;const float ConcretePrice=20;/声明类声明类Circle 及其数据和方法及其数据和方法class Circle private:float
50、radius;public:Circle(float r);/构造函数构造函数 float Circumference();/圆周长圆周长 float Area();/圆面积圆面积;43/类的实现类的实现/构造函数初始化数据成员构造函数初始化数据成员radiusCircle:Circle(float r)radius=r/计算圆的周长计算圆的周长float Circle:Circumference()return 2*PI*radius;/计算圆的面积计算圆的面积 float Circle:Area()return PI*radius*radius;44void main()float rad