资源描述
单击此处编辑母版文本样式,单击此处编辑母版标题样式,第五章 类与对象,本章主要内容,面向对象的思想,OOP,的基本特点,类概念和声明,对象,构造函数,析构函数,内联成员函数,拷贝构造函数,类的组合,类的声明(即类的定义),class rectangle,/,声明一个“矩形”类,private:,int,x,y,weight,high;,/,声明私有变量,public:,rectangle(int,xx,int,yy,int,w,int,h),/,声明构造函数,x=xx;y=,yy,;weight=w;high=h;,inline,int,area(),;,inline,int,rectangle:area(),return weight,*,high;,定义对象,定义一个位于坐标(,12,34,),重量,56,,高度,78,的矩形对象,r1,:,rectangle r1(12,34,56,78);,计算矩形,r1,的面积:,r1.area();,面向,对象,程序设计:,被结构化的结构化程序设计,;,对象:,一组,数据,及相关,代码,的结合体,;,数据:,描述对象的,属性,;,代码:,对数据进行处理的,操作,;,封装:,隐藏大部分,细节(数据、代码),;,接口:,对外开放一部分,属性,和,操作,;,类:,同类型对象的,抽象描述,,面向对象方法的,核心,;,聚合:,由简单对象组合而成的,复杂对象,;,消息:,对类的,成员函数的调用,,是对象之间,彼此联系,、,共同协作,的媒介,。,1,面向对象程序设计思想,1.1,面向对象程序设计的特点,1,抽象性:,抽取本质特性,(共性),,加以简单,描述,例如用,C+,语言将圆形,(circle),抽象如下:,数据抽象:,对象,属性,和,状态,的描述,double x,,,y,,,r,;,行为抽象:,数据所需要的,操作,setx,(),;,sety,(),;,setr,(),;,draw(),;,抽象是面向对象方法的核心,。,2,封装性:,内部细节对外隐藏,通过接口进行控制,使程序中各部分之间的相互影响达到最小;,提高程序的安全性;,简化代码的编写工作;,对象中的,数据,(即,属性,)、,操作代码,(即,行为,)称为对象的,成员,。,私有成员:对象中被隐藏的部分;,公有成员:对象与外界的接口。,封装的,两个目标,:,1.,数据和行为的包装;,2.,信息隐藏。,3,继承性:,复用共性,简化描述,一般类:,包含,共性,;,特殊类:,在一般类的基础上,增添每个具体类的,个性,;,继承:,特殊类的对象拥有,一般类的全部属性和操作,;,多继承:,一个类可以继承,多个一般类,的特性,。,例如:,Class A,/,一般类,A,作为,基类,Class B,/,一般类,B,作为,基类,Class C:public A,public B,/,派生类,C,是特殊类,多态性:,一个接口,多种方式,多态性也是面向对象程序设计的重要特性,之一。,多态性:,在,基类,中定义的属性和操作被,派生类,继承之,后,可以具有不同的数据类型或表现出不同,的行为,例如,函数重载,;,静态多态性:,在,编译过程,中确定同名操作的具体对象,;,动态多态性:,在程序,运行过程,中才确定操作所针对的,具体对象,;,联编,(,binding,绑定,),:,把一条,消息,和一个对象的,方法,相,结合,的,过程,,即,调用成员函数,;,消息:,(对类的成员函数的)调用,;,方法:,成员函数,;,静态联编:,在,编译阶段,完成联编,;,动态联编:,在程序,运行阶段,完成联编,。,2,类和对象,2.1,类的声明,类的声明即类的定义,,声明一个类的语法与结构,的声明类似:,class ,/class,是声明类的关键字,private,:,public,:,;,类的,成员函数,用于对数据成员进行处理,又称为“,方法,”,程序中通过类的成员函数来访问其内部的数据成员。一般类中成员函数的原型声明写在类定义体内,用以说明该成员函数的形式参数和返回值类型,而成员函数的定义体一般写在类定义之外。通常采用下面的形式定义成员函数:,:(),例如:,class rectangle,private:,int,x,y,weight,high;,public:,rectangle(int,xx,int,yy,int,w,int,h),x=xx;y=,yy,;weight=w;high=h;,inline,int,area(),;,;,inline,int,rectangle:area(),return weight,*,high;,类和对象的关系相当于普通数据类型与其变量的关系。,声明一个,类,:定义了一种新的,数据类型,;,对象,说明:创建这种,数据类型的物理实体,。,由同一个类创建的各个对象具有完全相同的数据结构,但它们的数据值在使用过程中可能各不相同。,一旦创建了一个类的对象,程序就可以用圆点运算符“,.,”,来引用类的公有成员,其一般形式为,或,2.2,对象,例如,用前面定义的,rectangle,类声明一个,rectangle,的对象,r1,,,通过对象,r1,完成对成员函数,area(),的调用:,rectangle r1(10,10,20,20);,r1.area(),;,注意:,只有用,public,定义的公有成员才能使用圆点操作符访问,对象中的私有成员是类中隐藏的数据,不允许在类外的程序中被直接访问,只能通过该类的公有成员函数来访问它们。,构造函数,:,在类中声明的一种,特殊的成员函数,;,作用:,将,对象初始化,为一个特定的状态,。,构造函数的名字,与,它所属的,类名相同,,被声明为,公有函数,,,没有返回值,,在创建对象时被,自动调用,。,构造函数可以,访问类的所有数据成员,,可以是,内联函数,,可以带有,参数表,,可以带,默认的形参值,。构造函数也可以,重载,,以提供初始化类对象的不同方法。,2.3,构造函数和析构函数,例如,前面定义的,rectangle,类,的构造函数为,rectangle(int,xx,int,yy,int,w,int,h),x=xx;y=,yy,;weight=w;high=h;,每个类都必须有构造函数,若类定义时没有定义任何构造函数,编译器会,自动生成,一个,不带参数,的缺省构造函数,其形式如下:,:(),/,定义拷贝构造函数的一般形式为:,class class_name,private:,public:,class_name(,形式参数表,),/,构造函数,函数体,class_name(class_name&ob_name),/,拷贝构造函数,函数体,拷贝构造函数调用场合,:,1.,用类的一个对象去初始化该类的另一个对象;,2.,函数的形参是类的对象;,3.,函数的返回值是类的对象。,2.,拷贝构造函数,作用:对象失效时,进行系统放弃对象内存之前的清,理工作,使内存可用来保存新的数据。析构,函数本身并不实际删除对象。,例:,rectangle,(),函数体,3.,析构函数,/ex4_1.cpp:,演示构造函数、拷贝构造函数和析构函数,#include ,class point,private:,int,x,y;,public:,point(int,xx=0,int,yy,=0),/,定义构造函数,x=xx;,y=,yy,;,cout,构造函数被调用,endl,;,point(point ,/,声明拷贝构造函数,point(),/,定义析构函数,cout,析构函数被调用,endl,int,getx,()return x;,int,gety,()return y;,;,point:point(point&p),/,定义拷贝构造函数,x=,p.x,;,y=,p.y,;,cout,拷贝构造函数被调用,endl,;,void f(point p),/,函数的形参是类的对象,cout,p.get_x()p.get_y(),endl,;,point g(),point a(7,33);,return a;,/,函数的返回值是类的对象,void main(),point a(15,22);,/,构造函数被调用,point b(a);,/,拷贝构造函数被调用,cout,b.get_x()b.get_y(),endl,;,f(b);,/,拷贝构造函数被调用,析构函数被调用,b=g();,/,构造函数和拷贝构造函数各被调用一次,,/,析构函数被调用两次,cout,b.get_x()b.get_y(),endl,;,/,析构函数被调用两次,程序的运行结果为:,构造函数被调用,拷贝构造函数被调用,15 22,拷贝构造函数被调用,15 22,析构函数被调用,构造函数被调用,拷贝构造函数被调用,析构函数被调用,析构函数被调用,7 33,析构函数被调用,析构函数被调用,类的应用举例,(,例3,),一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为,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 radius;,public:,Circle(float r);,/,构造函数,float Circumference()const;,/,圆周长,float Area()const;,/,圆面积,;,43,/,类的实现,:,/,构造函数初始化数据成员,radius,Circle:Circle(float r),radius=r,/,计算圆的周长,float Circle:Circumference()const,return 2*PI*radius;,/,计算圆的面积,float Circle:Area()const,return PI*radius*radius;,44,void main(),float radius;,float,FenceCost,ConcreteCost,;,cout,radius;,/,声明,Circle,对象,:,Circle Pool(radius);,Circle,PoolRim(radius,+3);,/,计算栅栏造价并输出,:,FenceCost,=,PoolRim.Circumference,()*,FencePrice,;,cout,Fencing Cost is,¥,FenceCost,endl,;,/,计算过道造价并输出,:,ConcreteCost,=(,PoolRim.Area,()-,Pool.Area,(),*,ConcretePrice,;,cout,Concrete Cost is,¥,ConcreteCost,endl,;,45,运行结果,Enter the radius of the pool:10,Fencing Cost is,¥,2858.85,Concrete Cost is,¥,4335.39,46,将一个已定义的类的对象作为另一个类的数据成员。例如:,Class A,;,Class B,private:,A a;,public:,;,2.4,类的组合,:(,形参表,),:,对象成员,1(,形参表,),,对象成员,2(,形参表,),,,类的初始化程序体,其中,构造函数冒号后的部分“对象成员,1(,形参表,),,对象成,员,2(,形参表,),,,”,称作,成员初始化列表,,用于完成对组合类中所,包含的对象成员的初始化,该表列出了初始化各对象成员所使用,的构造函数。,注意:,各成员对象的,构造函数的调用次序与,这些成员对象在,类中的,
展开阅读全文