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