第2章面向对象程序设计基础PPT讲稿.ppt
《第2章面向对象程序设计基础PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《第2章面向对象程序设计基础PPT讲稿.ppt(87页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第2章面向对象程序设计基础1第1页,共87页,编辑于2022年,星期一教学目标:v了解面向对象的基本概念了解面向对象的基本概念v 熟练掌握类、对象、派生类的定义和使用熟练掌握类、对象、派生类的定义和使用v 掌握类的构造函数和析构函数的定义和特点掌握类的构造函数和析构函数的定义和特点v 能够利用虚函数实现多态性能够利用虚函数实现多态性v熟悉友元的特性熟悉友元的特性 2第2页,共87页,编辑于2022年,星期一教学内容:2.1 面向对象的基本概念面向对象的基本概念2.2 类和对象的定义类和对象的定义2.3 继承性和派生类继承性和派生类 2.4 多态性多态性2.5 友元友元2.6 模板模板3第3页,
2、共87页,编辑于2022年,星期一2.1 面向对象的基本概念v观点:观点:自然界是由实体(对象)所组成。v程序设计方法:程序设计方法:使用面向对象的观点来描述、模仿并处理现实问题。v要求:要求:高度概括、分类、和抽象。v目的:目的:实现软件设计的产业化。程序=多个对象+消息4第4页,共87页,编辑于2022年,星期一类和对象v对象是现实世界中一个实际存在的事物对象是现实世界中一个实际存在的事物对象的静态特征对象的静态特征对象的行为对象的行为v类是具有相同属性和行为的一组对象的集合,它为属类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括于该类的全部对
3、象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。属性和行为两个主要部分。v对象之间的交互:发送消息对象之间的交互:发送消息5第5页,共87页,编辑于2022年,星期一封装v封装的目的是隐藏对象的内部的实现细节。封装的目的是隐藏对象的内部的实现细节。v通过封装,可以将对象的外部接口与内部的实现细通过封装,可以将对象的外部接口与内部的实现细节分开。节分开。v目的是目的是增强安全性增强安全性和和简化编程简化编程,使用者不必了解具,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。权限,来使用类的成员。6第6
4、页,共87页,编辑于2022年,星期一继承v继承是继承是C+中支持层次分类的一种机中支持层次分类的一种机制,允许程序员在保持原有类特性的基制,允许程序员在保持原有类特性的基础上,对新类进行更具体的说明。础上,对新类进行更具体的说明。v实现:声明派生类实现:声明派生类2.37第7页,共87页,编辑于2022年,星期一多态性v多态:同一名称,不同的功能实现方式。多态:同一名称,不同的功能实现方式。v目的:目的:标识统一,减少程序中标识符的个数;标识统一,减少程序中标识符的个数;接口统一,增加程序的灵活性接口统一,增加程序的灵活性v实现:实现:2.4编译时的多态性:重载函数编译时的多态性:重载函数运
5、行时的多态性:虚函数运行时的多态性:虚函数8第8页,共87页,编辑于2022年,星期一2.2 类与对象的定义v类是类是C+的灵魂,如果不真正掌握类,就不能真正的灵魂,如果不真正掌握类,就不能真正掌握掌握C+vC+中的类就是一种用户自己定义的数据类型,和其它中的类就是一种用户自己定义的数据类型,和其它数据类型不同的是,组成这种类型的不仅可以有数据,数据类型不同的是,组成这种类型的不仅可以有数据,而且可以有对数据进行操作的函数。而且可以有对数据进行操作的函数。v为了封装的需要,一般将类的定义放在一个为了封装的需要,一般将类的定义放在一个.h文件中,文件中,而将类的成员函数的实现放在一个而将类的成员
6、函数的实现放在一个.cpp文件中。文件中。9第9页,共87页,编辑于2022年,星期一2.2.1 类的定义class 类名称类名称 public:公有成员(外部接口)公有成员(外部接口)private:私有成员私有成员 protected:保护成员保护成员;类与外部的接口只允许本类中的函数访问(可省略)只能由本类及其派生类的成员函数访问是必需的成员访问说明符10第10页,共87页,编辑于2022年,星期一例2.1:圆类的定义见教材24页v/Circle.h文件,类文件,类CCircle的定义的定义vconst double PI=3.14159;/定义圆周率为符号常量定义圆周率为符号常量vcl
7、ass CCircle /定义类定义类vvpublic:vCCircle()/构造函数构造函数vradius=1;v virtual CCircle()/析构函数析构函数vinline double Area()const;/计算圆的面积计算圆的面积vdouble Circumference()const;/计算圆的周长计算圆的周长vdouble GetRadius()const v /取得圆的半径取得圆的半径vreturn radius;vvoid SetRadius(double r)/为半径设置新值为半径设置新值vradius=r0?r:1;vprivate:v double radiu
8、s;/数据成员数据成员v;vinline double CCircle:Area()const v/计算圆的面积计算圆的面积v v return PI*radius*radius;v/Circle.cpp文件,类文件,类CCircle的成员函数的实现的成员函数的实现#include“Circle.h”double CCircle:Circumference()const /计算圆的周长计算圆的周长 return 2*PI*radius;11第11页,共87页,编辑于2022年,星期一v类的数据成员(成员变量)类的数据成员(成员变量):与一般的变量声明相同,:与一般的变量声明相同,但需要将它放在
9、类的声明体中,一般为但需要将它放在类的声明体中,一般为私有访问私有访问属性。属性。v类的成员函数定义:类的成员函数定义:在类中说明原型,类外给出函数体实现,函数名之前必须加类在类中说明原型,类外给出函数体实现,函数名之前必须加类名和作用域区分符限定名和作用域区分符限定将成员函数定义为内联函数:将成员函数定义为内联函数:v成员函数在类的内部定义,此时无须使用inline关键字,成员函数自动为内联函数。v成员函数在类内声明,在类外定义。但在类外定义时,要加关键字inline。类的成员函数允许声明为说明:12第12页,共87页,编辑于2022年,星期一const成员函数vconst成员函数:成员函数
10、:不修改数据成员的值,不修改数据成员的值,在程序中如果不小心修改了这个成员函数中的对象,则在程序中如果不小心修改了这个成员函数中的对象,则编译器会产生一个语法错误信息。编译器会产生一个语法错误信息。vconst const 成员函数的定义方法:成员函数的定义方法:在函数的原型和定义中,在函数参数表和函数定义的在函数的原型和定义中,在函数参数表和函数定义的左花括号之间加入左花括号之间加入constconst关键字。关键字。v类的成员函数允许重载,允许带缺省参数值。类的成员函数允许重载,允许带缺省参数值。13第13页,共87页,编辑于2022年,星期一2.2.2 构造函数性质:性质:v与类同名、无
11、返回类型与类同名、无返回类型v在对象创建时在对象创建时由系统自动调用由系统自动调用v允许允许重载重载、带缺省值带缺省值v如果类中未声明,则系统自动生成一个如果类中未声明,则系统自动生成一个缺省形缺省形式式的构造函数,形如:类名()的构造函数,形如:类名()作用:对象的初始化14第14页,共87页,编辑于2022年,星期一构造函数举例-CCircle类class CCircle public:CCircle()/无参(缺省)构造函数无参(缺省)构造函数 radius=1;CCircle(double r);/带参构造函数带参构造函数 private:double radius;CCircle:C
12、Circle(double r)radius=r0?r:1;两个构造函数合成一个带缺省值的构造函数两个构造函数合成一个带缺省值的构造函数CCircle(double r=1);/构造函数原型构造函数原型CCircle:CCircle(double r)/构造函数定义构造函数定义 radius=r0?r:1;15第15页,共87页,编辑于2022年,星期一拷贝构造函数拷贝构造函数是一种特殊的构造函数,其形参为本类对象的引用。拷贝构造函数是一种特殊的构造函数,其形参为本类对象的引用。class 类名类名public:类名(形参);类名(形参);/构造函数构造函数 类名(类名(类名类名&对象名对象名
13、););/拷贝构造函数拷贝构造函数 ;类名类名:类名(类名类名(类名&对象名)对象名)/拷贝构造函数的实现拷贝构造函数的实现 函数体函数体 16第16页,共87页,编辑于2022年,星期一拷贝构造函数举例class CCircle public:CCircle(float r=1);CCircle(const CCircle&c)/拷贝构造函数 radius=c.radius;17第17页,共87页,编辑于2022年,星期一v当用类的一个对象去初始化该类的另一个对象时系统当用类的一个对象去初始化该类的另一个对象时系统自动调用它实现对象的拷贝赋值。自动调用它实现对象的拷贝赋值。void main
14、()CCircle c1;CCircle c2(c1);/拷贝构造函数被调用拷贝构造函数被调用拷贝构造函数调用之一18第18页,共87页,编辑于2022年,星期一拷贝构造函数调用之二v若函数的形参为类对象按值传递时,实参赋值给形参,若函数的形参为类对象按值传递时,实参赋值给形参,将自动调用复制构造函数,将自动调用复制构造函数,例如:例如:void fun1(CCircle c)coutc.GetRadius()-成员名成员名成员名成员名”方式方式25第25页,共87页,编辑于2022年,星期一this指针v在在C+中为每个非静态成员函数提供了一个名字为中为每个非静态成员函数提供了一个名字为th
15、is的指针,当进行成员函数调用时,系统自动将的指针,当进行成员函数调用时,系统自动将调用此成员函数的对象的地址作为一个隐含的参数调用此成员函数的对象的地址作为一个隐含的参数传递给传递给this指针,即让指针,即让this指针指向调用此成员函数指针指向调用此成员函数的对象,从而使成员函数知道该对哪个对象进行操的对象,从而使成员函数知道该对哪个对象进行操作。作。v使用使用this指针,保证了每个对象可以拥有不同的数据成指针,保证了每个对象可以拥有不同的数据成员,但处理这些数据成员的代码可以被所有的对象共享。员,但处理这些数据成员的代码可以被所有的对象共享。26第26页,共87页,编辑于2022年,
16、星期一例2.2 类的应用举例(教材28页)一圆型游泳池如图所示,现需要在其周围建一一圆型游泳池如图所示,现需要在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为圆型过道,并在其四周围上栅栏。栅栏价格为35元元/米,过道造价为米,过道造价为20元元/平方米。过道宽度为平方米。过道宽度为3米,游泳池米,游泳池半径由键盘输入。要求编程计算并输出过道和栅栏半径由键盘输入。要求编程计算并输出过道和栅栏的造价。的造价。游泳池过道问题分析:问题分析:圆类及其应用圆类及其应用27第27页,共87页,编辑于2022年,星期一第1步定义圆类v/Circle.h文件文件 vconst double PI=3.14
17、159;vclass CCircle vvpublic:v CCircle(double r=1);vdouble Circumference();v/计算圆的周长计算圆的周长vdouble Area();/计算圆的面积计算圆的面积vvirtual CCircle()vprivate:v double radius;v;v /Circle.cpp文件文件#include Circle.hCCircle:CCircle(double r)radius=r0?r:1;double CCircle:Area()return PI*radius*radius;double CCircle:Circum
18、ference()return 2*PI*radius;28第28页,共87页,编辑于2022年,星期一第2步 使用圆类求解问题v/Ex2_2Main.cpp文件文件v#includev#include“Circle.h”vconst double FencePrice=35;/栅栏单价栅栏单价vconst double ConcretePrice=20;/过道单价过道单价vvoid main()vvdouble radius,FenceCost,ConcreteCost;vcoutradius;vCCircle Pool(radius);/声明声明 Circle 对象对象vCCircle P
19、oolRim(radius+3);v/计算栅栏造价并输出计算栅栏造价并输出vFenceCost=PoolRim.Circumference()*FencePrice;vcout 栅栏造价是栅栏造价是:¥FenceCost endl;v/计算过道造价并输出计算过道造价并输出vConcreteCost=(PoolRim.Area()-Pool.Area()*ConcretePrice;vcout 过道造价是过道造价是:¥ConcreteCost-)34第34页,共87页,编辑于2022年,星期一2.3 继承性和派生类vv继承是面向对象程序设计的最重要的特点之一,是继承是面向对象程序设计的最重要的特
20、点之一,是软件重用软件重用的一种重要形式,是对实际问题中的一种重要形式,是对实际问题中分层特性分层特性分层特性分层特性的一种自然描述。的一种自然描述。v继承的实质:继承的实质:是从已有的类建立新类是从已有的类建立新类。v通过继承,派生类自动拥有基类的所有成员(数据通过继承,派生类自动拥有基类的所有成员(数据成员和成员函数)成员和成员函数)vv基类和派生类基类和派生类vv单继承和多继承单继承和多继承单继承和多继承单继承和多继承 35第35页,共87页,编辑于2022年,星期一2.3.1 派生类的定义class 派生类名:派生类名:继承方式继承方式 基类名基类名 成员声明;成员声明;36第36页,
21、共87页,编辑于2022年,星期一继承方式三种继承方式:三种继承方式:public(公有)、(公有)、private(私有)、(私有)、protected(保(保护),护),表表2-1 2-1 继承方式对派生类的影响继承方式对派生类的影响继承方式继承方式说说 明明publicpublic(公有)(公有)基基类类的的publicpublic和和protectedprotected成成员员被被派派生生类类继继承承后后,保保持持原原来来的的访访问问属属性性不变不变privateprivate(私有)(私有)基基类类的的publicpublic和和protectedprotected成成员员被被派派生
22、生类类继继承承后后,变变成成派派生生类类的的privateprivate成员成员protectedprotected(保保护)护)基基类类的的publicpublic和和protectedprotected成成员员被被派派生生类类继继承承后后,变变成成派派生生类类的的protectedprotected成员成员37第37页,共87页,编辑于2022年,星期一派生类构成示意图:派生类构成示意图:派生类派生类派生类派生类成员成员成员成员基类部分基类部分基类部分基类部分新定义部分新定义部分新定义部分新定义部分私有成员私有成员保护成员保护成员公有成员公有成员私有成员私有成员保护成员保护成员公有成员公有
23、成员 每个派生类对象所占有的存储空间的大小等于其基类每个派生类对象所占有的存储空间的大小等于其基类每个派生类对象所占有的存储空间的大小等于其基类每个派生类对象所占有的存储空间的大小等于其基类部分的所有部分的所有部分的所有部分的所有数据成员数据成员数据成员数据成员占有的存储空间的大小与新定义部分的所有占有的存储空间的大小与新定义部分的所有占有的存储空间的大小与新定义部分的所有占有的存储空间的大小与新定义部分的所有数据成员数据成员数据成员数据成员占有的存储空间的大小的总和。占有的存储空间的大小的总和。占有的存储空间的大小的总和。占有的存储空间的大小的总和。38第38页,共87页,编辑于2022年,
24、星期一例2.3 类的派生示例教材31页 点-圆-圆柱体 1 定义基类定义基类CPointv /Point.h文件文件v#include vclass CPoint /基类基类CPointvvpublic:vCPoint(double xx=0,double yy=0);vvirtual CPoint();vdouble GetX()return X;vdouble GetY()return Y;vdouble area()return 0.0;vprivate:vdouble X,Y;v;v CPoint:CPoint(double xx,double yy)X=xx;Y=yy;coutCPo
25、int 类构造函数被调用类构造函数被调用n;CPoint:CPoint()cout0?r:1;coutCCircle 类构造函数被调用类构造函数被调用n;CCircle:CCircle()cout0?h:1;vcoutCCylinder 类构造函数被调用类构造函数被调用n;vvCCylinder:CCylinder()vv coutCCylinder 类的析构函数被调用类的析构函数被调用n;v42第42页,共87页,编辑于2022年,星期一派生类的使用v/Ex2_3Main.cpp文件文件v#include v#include Cylinder.hvvoid main()v v CCylind
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 程序设计 基础 PPT 讲稿
限制150内