1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,类和对象,1,面向对象的思想,班级对象:,班级的静态特征,所属的系和专业、班级的人数,所在的教室等。这种静态特征称为属性;,班级的动态特征,如学习、开会、体育比赛等,这种动态特征称为行为。,按钮对象:,按钮的内容、大小,按钮的字体、图案等等,针对按钮的各种操作,创建、单击、双击、拖动等,软件工程追求的目标之一就是可维护性,可维护性主要表现在,3,个方面:,可理
2、解性、可测试性和可修改性。,面向对象的主要好处就是显著的改善了软件的可维护性。,为了完成计算,必须设计出一个计算方法或解决问题的过程。因此,,软件设计的主要工作就是设计求解问题的过程,以,OO,为例,对应于软件开发的过程,,OO,衍生出,3,个概念:,OOA,、,OOD,和,OOP,。采用面向对象进行分析的方式称为,OOA,,采用面向对象进行设计的方式称为,OOD,,采用面向对象进行编码的方式称为,OOP,。面向过程,(OP,)和面向对象,(OO),本质的区别在于分析方式的不同,最终导致了编码方式的不同。,蛋炒饭 盖浇饭,面向过程,(OP),与面向对象,(OO),面向对象的软件工程,面向对象的
3、软件工程是面向对象方法在软件工程领域的全面应用。它包括,:,面向对象的分析(,OOA,),面向对象的设计(,OOD,),面向对象的编程(,OOP,),面向对象的测试(,OOT,),面向对象的软件维护(,OOSM,),4,从面向过程到面向对象,在结构化程序设计中,采用的是“自顶向下,逐步细化(,divide and conquer,stepwise refinement,)”的思想。它的具体操作方法是,模块化,,是按功能来分的,所以也称,功能块,。也就是从一般事物中抽象出来的操作,在,C+,中称为一个,函数,,一个函数解决一个问题,即实现一个功能或一个操作。当程序规模和复杂性达到一定程度时不可避
4、免地引入大量的,全局变量,,优良的模块化没法坚持到底。,在模块化的思想中已经出现了,封装,的概念,这个封装是把数据封装到模块中,即局部变量。但这是很不彻底的,因为模块是,功能的抽象,,而数据则是具有其个性的,一但发生那怕是一点变化,抽象的功能模块就不再适用了。如一个管理软件,管理规则变化了,则管理模块以及所有与之有联系的模块都必须更改,必须重新进行功能抽象,必须重新建立模块间联系的规则。可维护性差成了制约结构化程序设计应用的瓶颈。,从面向过程到面向对象,对象的概念是面向对象技术的核心所在。面向对象技术中的,对象,就是,现实世界,中某个具体的,物理实体,在,计算机,逻辑中的,映射和体现,。,一部
5、移动电话,,它是现实世界中的一个实体。它由天线、发射部件、接收部件、显示屏、按键、专用集成电路芯片及外壳组成;它有着其实在的功能,可以打电话,可以发短消息,可以存储、输入和编辑各种个人信息,甚至可以上网。这样一个实体可以在计算机世界中映射为一个计算机可以理解、可以操纵、具有前面所叙述的属性和操作的对象。,一辆自行车,,它由车架、车轮、脚踏和传动机构、变速机构等组成,它具有代步功能,它可以进行变速骑行,特别要强调的是,它有一些特征可以把你的这辆自行车与其他自行车区分开来,,其中最重要的是钢印号。这些都可以在面向对象的程序中用对象及其属性和操作模拟出来。,从面向过程到面向对象,对象,类,计算机世界
6、实体,抽象类别,现实世界,客观世界,抽象,抽象,实例化,映射,主观世界,图,1,对象、实体与类,现实世界中的实体可以抽象出类别的概念。对应于计算机世界就有一个类(,class,)的概念,因为类是一个抽象的概念的对应体,所以计算机不给它分配内存,只给对象分配内存。图,1,表达了计算机世界与现实世界之间的对应关系。,每个对象都属于一个特定的类型,2,面向对象程序设计的特点,四个基本特征:,抽象,(,类,)(,数据抽象,+,代码抽象,),封装,(,过程和数据封藏起来,),继承,(,基类和派生类,),多态性,(,虚函数、函数重载,),抽象(,abstraction,),抽象是对具体对象(问题)进行概
7、括,抽出这一类对象的公共性质并加以描述的过程。,先注意问题的本质及描述,其次是实现过程或细节。,数据抽象(,data abstraction,):描述某类对象的属性或状态(对象相互区别的物理量)。它是以数据为中心,及其能对其实施的操作作为一个整体(对象)来进行描述。,OOP,所基于的抽象就是数据抽象。,代码抽象(过程抽象,,procedural abstraction,):描述某类对象的共有的行为特征或具有的功能。就是指把程序的一些功能抽象为子程序。它对数据和操作的描述是分离的。,抽象的实现:通过类的声明。,9,抽象实例钟表,数据抽象:,数据描述:,int,Hour,int,Minute,in
8、t,Second,代码抽象:,SetTime(),ShowTime(),10,抽象实例钟表类,class Clock,public,:,void,SetTime,(int NewH,int NewM,int NewS);void,ShowTime,();,private,:,int Hour,Minute,Second;,;,11,抽象实例人,数据抽象:,数据描述:,char*,name,char*,gender,int,age,int,id,代码抽象:,生物属性角度:,GetCloth,(),Eat,(),Step,(),社会属性角度:,Work,(),Promote,(),12,封装,(,
9、encapsulation,),它是与抽象相关的概念。抽象考虑的是程序实体的外部行为,而封装考虑的则是它的内部实现。,封装把过程和数据隐藏起来,将它们视为一个整体,对数据的访问只能通过已定义的界面。,过程封装:是指对数据封装,它通过子程序(即函数)实现。但是操作所需数据是公开的,缺乏对数据的保护。,数据封装:是把数据和操作封装起来,使使用者看不到数据表示,只能通过相应操作来操作数据。在,OOP,中通过对象属性实现了数据及其操作的封装,封装为信息隐藏提供了支持。,目的是加强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。,实现封装:类声明中
10、的,14,封装,实例:,class Clock,public,:void,SetTime,(int NewH,int NewM,int NewS);void,ShowTime,();,private,:int Hour,Minute,Second;,;,特定的访问权限,外部接口,15,继承与派生,连接类与类的层次模型,利用现有类派生出新类的过程称为类继承,支持代码重用、提供了无限重复利用程序资源的途径、节省程序开发的时间和资源,是,OOP,的关键。,基类和派生类,实现:声明派生类,16,多态性,(,polymorphism,),多态:,发出同样的消息被不同类型的对象接收时导致完全不同的行为,既
11、单一接口,多种实现,是,OOP,的重要补充。,在程序设计中多态性体现为:,一名多用,指在同一作用域中一个名字有多种含义,主要通过重载(,overloading,)来实现,包括函数名重载和操作符重载。,类属性,指一个程序实体能对多种类型的数据进行操作或描述的特性,能具有类属性的程序实体通常有类属函数和类属类型。类属函数通过指针和函数模板实现,类属类型通过共用体和类模板实现。,17,在,OOP,中,由于类之间可以有继承关系,因此还存在下面的多态:,对象类型的多态:子类对象既属于子类,也属于父类,对象标识的多态:父类的引用或指针既可引用或指向父类,也可引用或指向子类。,消息的多态:父类和子类对一个公
12、共的消息集有不同的解释。,多态的好处:易于实现程序高层代码复用,增强语言的可扩充性,与多态相关的概念是联编(或绑定,,binding,),联编:指对多态元素使用的过程,即确定对多态元素的某个使用是多态元素的哪一种形式(如对重载函数的绑定)。分为:,静态联编(,static binding,):指在编译时刻确定对多态元素的使用。如对象标识符的多态和消息的多态。,动态联编(,dynamic binding,):指在运行时刻来解决这个问题。如虚函数。,18,3,面向对象编程:,将数据及对数据的操作方法放在一起,作为一个相互依存、不可分离的整体,-,对象。对同类型对象抽象出其共性,形成类。类中的大多数
13、数据、只能用本类的方法处理。类通过有限的接口与外界发生关系,对象与对象之间通过消息进行通信。,程序,=,对象,+,对象,+,对象,+,对象,+.,对象,=,数据,+,方法,优点:,程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。,通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。,适合于大程序长时间的开发工作,对象的两个要素,静态特征(属性),动态特征(行为),班级作为一个对象,班级所属系、专业、学生人数、所在的教室等。,学习、开会、体育比赛等。,如果想从外部控制班级中学生的活动,可以从外界向班级发一个信息(如听到广播声就去上早操,听到打铃
14、就下课等)称为消息。,对象之间通过发送和接收消息互相联系。,消息包括,:,目标对象,请求的方法,参数,在面向对象程序设计中,类和对象是两个最基本的概念。,对象是客观事物在计算机中的抽象描述;,类则是对具有相似属性和行为的一组对象的统一描述。,例如,一个班级中的每一位同学都是一个客观事物,可以在计算机中进行抽象的描述,称为对象;,而这些对象都具有学号、姓名、性别、年龄等相似的属性以及查询成绩、修改所选课程等相似的行为,为此可以将这些学生对象进行统一的描述,即定义成学生类。,21,6.1,类,类是把各种不同类型的数据和对数据的操作组织在一起而形成的用户自定义的数据类型。,其中,把不同类型的数据称为
15、数据成员,把对数据的操作称为成员函数,类的声明,类的定义,成员函数的定义,数据成员的定义,22,01.,为什么要引入类,工资单:姓名、单位、编号,.,成绩单:姓名、学号、各科成绩,.,简单数据单元无法将这样记录作为一个数据单位处理,一一对应关系,引例,定义一有关职工工资信息的结构类型,对某职工的该类信息进行处理。职工信息包括姓名、基本工资、岗位工资和职务工资;对该类信息的处理包括输入、输出和求总收入情况。,#include iostream.h,struct stuff,char name10;,double jw,gw,zw;,s;,void print(),couts.name:s.jwt
16、s.gwts.zws.names.jws.gws.zw;,double salary(),double sum=0;,sum=sum+s.jw+s.gw+s.zw;,return sum;,void main(),input();,print();,coutsalary();,结构化的方法,结构化程序的框架,结构化程序,#include iostream.h,class stuff,private:,char name10;,double jw,gw,zw;,public:,void print(),coutname:jwtgwtzwnamejwgwzw;,;,double salary(),
17、double sum=0;,sum=sum+jw+gw+zw;,return sum;,void main(),stuff s;,s.input();,s.print();,couts.salary();,以面向对象的方式实现,02.,以工资单为例,月份,工号,姓名,工作部门,工作时间,基本工资,2002.9,0002,张三,长安大学,1990.7.1,1000,校内津贴,岗位津贴,水电费,房租,实发工资,200,300,50,150,1300,03.,类的层次关系,工作部门:字符串,姓名:字符串,职务:代码(,099,),int,工作时间:,年,(xxxx):int,月,(112):char
18、日,(131):char,家庭情况,婚否:,(0,1)int,是否是双职工:,int,工资,基本工资,:double,岗位津贴,:double,劳保福利,:double,独生子女,:double,房租,:double,电费,:double,水费,:double,取暖费,:double,保育费,:double,实发工资,:double,类,(Class)-,数据类型,类是具有相同属性和相同的方法的对象的集合,它是一种既包含数据又包含函数的,抽象数据,类型。,类是将一类对象和其他对象区别开来的一组描述。,类是对象集合的抽象,对象是类的一个实例。,类,具有封装和隐藏性、还具有继承性。,类属于类型的
19、范畴,类的种类,用,struct,关键字声明的类,用,union,关键字声明的类,用,class,关键字声明的类,类的定义,1,数据成员(,Data Member,),即类的属性;,2,成员函数(,Member Function,),即类的方法;,3,构造函数(,constructor,)和析构函数(,destructor,);,4,运算符函数。,对象,(Object)-,数据,对象是包含现实世界物体特征的抽象,实体,,反映了系统为之保存信息和(或)与之交互的能力。,对象,=,数据,+,作用于这些数据上的操作,=,属性,(Attribute)+,方法,(Method),类和对象的关系,:,说明
20、类和对象的关系相当于普通数据类型与其变量的关系。,对象是类类型的变量,消息,(Message)-,函数调用,消息是向某对象请求服务的一种表达方式。,对象之间通过传递消息来实现相互的通信。,6-1-1,类的定义,C+,中,类定义包括,类说明,和,类实现,两大部分。,说明部分提供了对该类所有数据成员和成员函数的描述;,实现部分则提供了所有成员函数的实现代码。,34,类定义的一般形式为:,class,类名,private:,数据成员或成员函数,protected:,数据成员或成员函数,public:,数据成员或成员函数,;,35,说明,(,1,)类声明以关键字,class,开始,其后跟类名。,(
21、2,)类所声明的内容用花括号括起来,这一对花括号“,”,之间的内容称为类体。,(,3,)类中定义的数据和函数分别是数据成员和成员函数,36,如:下例中定义了一个描述学生的类。,class Student,private:/private,成员,int number;/,数据成员,表示学号,char name20;/,数据成员,表示姓名,char sex;/,数据成员,表示性别,int age;/,数据成员,表示年龄,public:/public,成员,void set(int a,char*b,char c,int d);,/,成员函数,用于给各数据成员赋值,void show();/,成员
22、函数,用于显示各数据成员的值,;,37,6.1.2,类成员的访问权限,类成员具有不同的访问权限,具体可以分成三个部分,即私有部分(,private,)、公有部分(,public,)和保护部分(,protected,),并分别由,private,、,public,和,protected,这三个关键字后跟冒号“,:”,来指定。,这三种访问权限控制符可以以任何顺序出现,且在同一个类的定义中,这三个部分并非必须同时出现。,(,1,),private,部分:类的,private,部分说明的数据成员和成员函数在类之外是不能访问的,只有类中的成员函数才能访问,private,部分的数据成员和成员函数。,38
23、2,),protected,部分:类的,protected,部分说明的数据成员和成员函数是不能在类之外访问的,只有类的成员函数及其子类(派生类)可以存取,protected,部分的成员。,(,3,),public,部分:类的,public,部分说明的数据成员和成员函数可以被程序中的任何函数或语句访问。,public,部分的成员多为成员函数,用来提供一个与外界的接口,外界只有通过这个接口才可以实现对,private,部分成员的访问。,(,4,)在定义类时,当未指明成员是属于哪部分时,默认是属于,private,部分,但一般不提倡采用默认形式。,39,私有成员,公有成员,保护成员,类内函数,
24、可以调用,可以调用,可以调用,类外函数,不可调用,可以调用,不可调用,私有函数,公有函数,保护函数,类内函数,可以调用,可以调用,可以调用,类外函数,不可调用,可以调用,不可调用,实例,6-1,定义一个,Person,类,用来说明人员类对象,/Example 6-1,:定义,Person,类,可以存为,person.h,class Person,private:,/,可省略,charm_strName20;,int m_nAge;,intm_nSex;,public:,voidRegister(char*name,int age,char sex);,char*GetName();,int G
25、etAge();,charGetSex();,voidShowMe();,;,成员函数,成员数据,:,与一般的变量声明相同,但需要将它放在类的声明体中,在类外不能直接使用,必须通过成员函数进行设置。,【,实例,6-2】,定义日期类,class,Tdate,/,定义日期类,int month;,int day;,int year;,public:,/,定义公有成员函数,void Set(int m,int d,int y);,/,置日期值,int IsLeapYear();,/,判是否闰年,void Print();,/,输出日期值,;,6.1.3,类的数据成员,类的数据成员描述的是类所表达的问
26、题的属性。,数据成员要在类的类体中进行定义,其定义的方法和一般变量的定义方法相同,但对于数据成员的访问要受到访问权限(,private,、,protected,或,public,)的控制。,在定义类的数据成员时,要注意一个问题:在类体中不允许对类的数据成员初始化。例如:,class Student,private:,int number;,char name20;,char sex;,int age=20;,/,错误的,public:,void set(int a,char*b,char c,int d);,void show();,;,43,6.1.4,类的成员函数,类的成员函数描述的是类所
27、表达的问题的行为。,类中的所有成员函数都要在类的类体中进行,说明,,但成员函数的定义既可以在类体中给出,也可以在类体外给出。,44,成员函数的定义,成员函数是程序算法实现部分,是对封装的数据进行操作的唯一途径。,在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成,内联成员,函数。,允许声明重载函数和带默认形参值的函数,成员函数的分类,外联,函数:,内联函数:,在类定义体中声明而在类外定义的成员函数,。,内联函数是指程序在编译时将函数的代码插入在函数的每个调用处,作为函数体的内部扩展,,inline,(1),外联函数,在类外定义成员函数的具体
28、形式为:,返回值类型,类名,:,成员函数名,(形式参数表),函数体,作用域运算符,其中“”是作用域运算符,“类名”是成员函数所属类的名字,“”用于表明其后的成员函数是属于这个特定的类。换言之,“类名成员函数名”的意思就是对属于“类名”的成员函数进行定义,而“返回类型”则是这个成员函数返回值的类型。余下的工作就是定义成员函数的函数体。,实例,6-1,编写,Person,类成员函数的定义。,/Example 6.1,:,Person,类成员函数的定义,可以存为,person.cpp,void Person:Register(char*name,int age,char sex),strcpy(m_
29、strName,name);,m_nAge=age;,m_nSex=(sex=m?0:1);,char*Person:GetName(),return m_strName;,int Person:GetAge(),return m_nAge;,char Person:GetSex(),return(m_nSex=0?m:f);,void Person:ShowMe(),cout GetName()t GetAge()t GetSex()=1,year=(yy=1900,day=(dd=1,int Tdate:IsLeapYear(),/,判是否闰年,return(year%4=0,实实例,6-
30、2,日期成员函数定义,void Tdate:Print(),/,输出日期值,coutmonth”/”day”/”year=1,year=(yy=1900,day=(dd=1,int IsLeapYear(),/,判是否闰年,return(year%4=0,void Print(),/,输出日期值,coutmonth”/”day”/”year=1,year=(yy=1900,day=(dd=1,或,void,inline,Tdate:Set(int mm,int dd,int yy),/,置日期值,省略,成员函数定义在类内和类外有个重要区别:类内定义的函数被当做内联函数,而类外定义的函数缺省当做
31、非内联函数。,inline,函数值类型 类名,:,函数名(参数),在定义一个类时,要,注意,如下几点:,1,、类具有封装性,并且类只是定义了一种结构(样板),所以,类中的任何成员数据均不能使用关键字,extern,,,auto,或,register,限定其存储类型,。,2,、在定义类时,只是定义了一种导出的数据类型,,并不为类分配存储空间,,所以,在定义类中的数据成员时,,不能对其初始化,。如:,class Test int x=5,y=6;/,是不允许的,extern float x;/,是不允许的,在,C+,语言中,,结构体类型,只是类的一个特例。结构体类型与类的唯一的区别在于:,在类中,
32、其成员的缺省的存取权限是私有的;而在结构体类型中,其成员的缺省的存取权限是公有的。,类实际上是一种抽象机制,它描述了一类问题共同的属性和行为。,类名仅提供一种类型定义,只有在定义属于类的变量后,系统才会为其预留空间,这种变量称为对象,它是类的实例。,对象是面向对象方法的主体,当一个对象映射为软件实现时由三部分组成:,私有的数据结构:,它用于描述对象的内部状态。,处理:,也称为操作或方法,它施加于数据结构之上。,接口:,这是对象可被共享的部分,消息通过接口调用相应的操作。接口规定哪些操作是允许的。它不提供操作是如何实现的信息。,类的变量我们称之为对象。,6.2,对象,6.2.1,对象的定义,类名
33、 对象名(参数表);,类是抽象的概念,而对象是具体的概念;,每个对象占用了各自的存储单元,每个对象都各自具有了该类的一套数据成员(静态成员除外),而所有成员函数是所有对象共有的。,每个对象的成员函数都通过指针指向同一个代码空间。,数据区,对象,公共代码区,数据区,对象,数据区,对象,55,class location,private:,int x,y;,public:,void init(int x0,int y0);,int Getx(void);,int Gety(void);,dot1,dot2;,例,(1),方法一:在定义类的同时直接定义,(2),方法二:在使用时定义对象,说明对象的一
34、般形式,(,类的实例化,),:,如,假设,A,是一个已定义过的类,则可定义:,指向,A,类对象的指针,A,类的对象,对象数组,存储类型,类名 对象名表;,A a1,,*,p,,,a5,类名 *指针变量名表;,Student stu;/,定义,Student,类的对象,stu,Student*p;/,定义指向,Student,类的指针,p=/,使指针变量,p,指向对象,stu,6.2.2,对象的指针,58,6.2.3,访问对象的成员,格式,1,:对象名,.,成员名,格式,2,:指针变量名,-,成员名,格式,3,:,(*,指针变量名,).,成员名,【,例,6-1】,访问对象的成员。,59,类内,:
35、成员函数访问数据成员,),直接访问类成员,类外,:(,外部程序访问类的公有数据成员或成员函数,),对象成员,访问方式同结构成员,对象的成员表示如下:,.,或者,.,(,),前者用于表示数据成员,后者用于表示成员函数。这里的“,.”,是一个运算符,该运算符的功能是表示对象的成员。,类成员的访问方式,指向对象的指针的成员表示如下:,-,或者,-,(,),同样,前者用于表示数据成员,后者用于表示成员函数。这里的,“,-,”,是一个表示成员的运算符,它与前面介绍过的,“,.,”,运算符的区别是:,“,-,”,用来表示指向对象的指针的成员,而,“,.,”,用来表示一般对象的成员。,对于数据成员和成员
36、函数,以下两种表示方式是等价的:,-,与,(*,),.,说明:,在建立对象时,只为对象分配用于保存数据成员的内存空间,,而成员函数的代码为该类的每一个对象所共享,。,用成员选择运算符“,.”,只能访问对象的,公有,成员,,而不能访问对象的私有成员或保护成员。,若要访问对象的,私有,的数据成员,只能通过对象的,公有,成员函数来获取,。,在类的作用域外,禁止直接访问一个对象中的私有成员,同类对象之间可以整体赋值,例如:,Person,对象的引用,Person person1,person2;,int nage=person1.GetAge();person1=person2;,Person*p;,
37、p=new Person;,nage=p-GetAge();,对象可以作函数的入口参数(实参、形参),也可以作函数的出口参数,也可以作引用参数。这与一般变量作为函数的参数是完全相同的。,可以定义类类型的指针,类类型的引用,对象数组,指向类类型的指针数组和指向一维或多维数组的指针变量,,但不能取私有数据成员的指针或成员函数的地址,一个类的对象,可作为另一个类的成员,实例,6-1,完整的人事资料输入输出程序。,/Example 6-1,:人事资料的输入和输出,#include“person.h,void main(),char name20,sex;int age;,Person person1,
38、person2;,/,定义对象,cout name age sex;,person1.Register(name,age,sex);,/,对象的引用,cout person1:t;person1.ShowMe();,person1.Register(Zhang3,19,m);,cout person1:t;person1.ShowMe();,person2=person1;,/,对象之间的赋值,cout GetAge();,相当于成员数据间相互赋值,实例,6-2,#include,#include Tdate.h,void main(),Tdate date1,date2;,Tdate*p;,
39、p=,date1.Set(10,20,2012);,if(date1.IsLeapYear(),date1.Print();coutis leap year;,else,coutPrint();,【,实例,6-3】,类的应用举例,#include,class Clock/,时钟类的声明,public:/,外部接口,公有成员函数,void SetTime(int NewH,int NewM,int NewS);,void ShowTime();,private:/,私有数据成员,int Hour,Minute,Second;,;,/,时钟类成员函数的具体实现,void,Clock:,SetTim
40、e(int H,int M,int S),Hour=H;,Minute=M;,Second=S;,void,Clock:,ShowTime(),coutHour:Minute:Secondendl;,void main(),Clock myClock;,myClock.Hour=20;,myClock.Minute=40;,myClock.Second=26;,coutmyClock.Hour:myClock.Minute:myClock.Secondnumber=a;,strcpy(this-name,b);,this-sex=c;,this-age=d;,67,6.2.5,对象的作用域与生
41、存期(放最后讲),对象是类的实例,它的实质就是某种数据类型的变量。,class Desk /,定义,Desk,类,public:,int weight;int high;,int width;int length;,;,class Stool /,定义,Stool,类,public:,int weight;int high;,int width;int length;,;,Desk da;/,定义全局对象,Stool sa;,void fn(),static Stool ss;/,定义局部静态对象,Desk da;/,定义局部对象,/,68,1,局部对象,局部对象(不包括局部静态对象)的作用域
42、是定义它的函数体,其生存期是从函数调用开始到函数调用结束,当下一次重新调用函数时,再重新构造对象。,构造局部对象的次序(即分配存储单元的次序)是按照它们在函数体中声明的次序进行的。,局部对象所占的存储空间被分配在程序的动态区(栈区)中。,69,2,静态对象,静态对象(局部静态对象和全局静态对象)的作用域是定义它的函数体或程序文件,其生存期是整个程序的运行时间。,构造静态对象的次序是按它们在程序中出现的先后次序,且在整个程序运行开始时(即在主函数运行前)只构造一次。,静态对象所占的存储空间被分配在程序的静态区(全局区)中。,70,3,全局对象,全局对象的作用域是整个程序,其生存期是整个程序的运行
43、时间。,它也是在程序运行前(即在主函数运行前)只构造一次。,全局对象所占的存储空间被分配在程序的静态区(全局区)中。,4,类中成员的构造次序,类中成员的构造次序是以类中声明成员的次序进行的。,71,实例 具有静态、动态生存期对象的时钟程序,#include,using namespace std;,class Clock/,时钟类声明,public:/,外部接口,Clock();,void SetTime(int NewH,int NewM,int NewS);,/,三个形参均具有函数原型作用域,void ShowTime();,Clock(),private:/,私有数据成员,int Hou
44、r,Minute,Second;,;,/,时钟类成员函数实现,Clock:Clock()/,构造函数,Hour=0;,Minute=0;,Second=0;,void Clock:SetTime(int NewH,int NewM,int NewS),Hour=NewH;,Minute=NewM;,Second=NewS;,void Clock:ShowTime(),coutHour:Minute:Secondendl;,20,Clock,globClock;,/,声明全局对象,globClock,,,/,具有静态生存期,文件作用域,void main(),/,主函数,coutFirst ti
45、me output:endl;,/,引用具有文件作用域的对象:,globClock,.,ShowTime(),;,/,对象的成员函数具有类作用域,globClock,.,SetTime(8,30,30),;,Clock,myClock,(globClock);,/,声明具有块作用域的对象,myClock,coutSecond time output:endl;,myClock,.ShowTime();,/,引用具有块作用域的对象,21,6.3,构造函数与析构函数,在声明对象的同时给它的数据成员赋初值,称为对象的初始化。,在对象使用结束时,还经常需要进行一些清理工作。,C+,中对象的初始化和清理
46、工作分别由两个特殊的成员函数来完成,即构造函数和析构函数。,75,构造函数(,Constructor,)定义了创建对象的方法,提供了初始化对象的一种简便手段。,构造函数的作用是:为对象分配空间;对数据成员赋初值;请求其他资源。,对象的初始化是指对象数据成员的初始化,,在使用对象前,一定要初始化.,对对象初始化的方法,普通成员函数来初始化,构造函数对对象进行初始化,使用上的不便,和不安全,6.3.1,构造函数,构造函数(,Constructor,),是与类名同名的特殊的成员函数;,构造函数的执行是在系统创建对象时,自动执行,。,构造函数的定义格式为:,类名(形参说明),函数体,【,例,6-2】,
47、修改,【,例,6-1】,中的,Student,类,为其定义构造函数,完成对象的初始化工作。,77,对于对象的,初始化,,采用,构造函数(,constructor,),。,当需要对对象进行初始化时,总是编写一个或一组构造函数。,构造函数是特殊的公有成员函数,,其特征如下:,函数名与类名相同。,构造函数无函数返回类型说明,。注意是没有而不是,void,,即什么也不写,也,不可写,void,!实际上,构造函数有返回值,返回的就是构造函数所创建的对象,。,是成员函数,可写在类体内,亦可写在类体外。,在程序运行时,当新的对象被建立,该对象所属的类的构造函数自动被调用,在该对象生存期中也,只调用这一次,。
48、构造函数可以重载,。严格地讲,说明中可以有多个构造函数,它们由不同的参数表区分,系统在自动调用时按一般函数重载的规则选一个执行。,构造函数允许参数缺省调用,允许为,内联,函数、,带默认形参值,的函数,new,操作符自动调用生成对象的构造函数,实例,6-4,构造函数举例,class Clock,public:,Clock(int NewH,int NewM,int NewS);/,构造函数,void SetTime(int NewH,int NewM,int NewS);,void ShowTime();,private:,int Hour,Minute,Second;,;,79,构造函数的实
49、现:,Clock:Clock(int NewH,int NewM,int NewS),Hour=NewH;,Minute=NewM;,Second=NewS;,/,其他函数略,建立对象时构造函数的作用:,void main(),Clock c(12,0,0);/,隐含调用构造函数,将初始值作为实参。,c.ShowTime();,31,6.3.2,构造函数的重载,如果一个类中出现了两个以上的同名成员函数,则称为类的成员函数的重载。,一个类的成员函数和另一个类的成员函数同名;,一个类的成员函数与一个类外的函数同名;,81,在类的成员函数的重载中,比较常见的形式是,构造函数的重载,。,在对象定义时,
50、系统会根据参数的类型及个数选择调用某一种合适的构造函数完成对象的构造。,【,例,6-3】,修改,【,例,6-2】,中的,Student,类,为其定义两个构造函数:一个无参构造函数和一个有参构造函数,完成对象的初始化工作。,82,实例,6-4,构造函数重载举例,class Clock,public:,Clock();/,构造函数,Clock(int NewH,int NewM,int NewS);/,重载构造函数,void SetTime(int NewH,int NewM,int NewS);,void ShowTime();,private:,int Hour,Minute,Second;,






