《面向对象程序设计》教案.doc

上传人:wux****ua 文档编号:8937831 上传时间:2020-04-02 格式:DOC 页数:104 大小:360.50KB
返回 下载 相关 举报
《面向对象程序设计》教案.doc_第1页
第1页 / 共104页
《面向对象程序设计》教案.doc_第2页
第2页 / 共104页
《面向对象程序设计》教案.doc_第3页
第3页 / 共104页
点击查看更多>>
资源描述
教 案分 院 (部) 信息学院 教 研 室 计算机科学与技术课 程 名 称 面向对象程序设计教 师 姓 名 金淑娟 职 称 讲 师 使 用 教 材 C+语言程序设计 教 务 处 制授课内容:第一章 面向对象程序设计概念授课时数6教学目的及要求:了解:程序设计方法的发展过程,面向对象语言的特点。掌握:面向对象的概念,面向对象的程序开发过程。教学基本内容:程序设计方法的发展过程;面向对象程序设计的基本思想及概念,面向对象程序设计的要点及开发过程。重点及难点:面向对象的概念,面向对象的程序开发过程。教学方法:讲授法 讨论法 自学指导法 其他 教学手段:多媒体 实物 模型 挂图 音像 其他板书设计:讨论、思考题、作业:1 叙述面向对象基本思想的特点。2 叙述面向对象的程序设计方法与传统面向过程的程序设计方法有何不同。3 什么是类,什么是对象,类和对象是怎样的关系?4 抽象包括哪两方面的含义?5 什么是封装,它具有怎样的特点?6 什么是多态?多态的实现方式及作用有哪些?7 什么叫对象的封装性?什么叫信息隐藏?C+语言是怎样实现信息隐藏的?8 什么叫继承?什么叫派生?9 什么叫多态性?多态性主要有哪几种?10. 什么叫运行时的多态性?C+语言中是怎样实现运行时的多态性的?参考资料(含参考书目、文献等):1、Harvey M.Deitel及Paul James Deitel著,C+大学教程(第三版),电子工业出版社。2、刘正林,面向对象程序设计,华中科技大学出版社。3、周生炳等,面向对象程序设计,清华大学出版社。4、揣锦华,面向对象程序设计与VC+实践,西安电子科技大学出版社。5、王育坚编,面向对象编程教程, 清华大学出版社。6、王萍编著,C+面向对象程序设计, 清华大学出版社出版。7、徐孝凯等编,面向对象程序设计实验, 中央广播电视大学出版社出版。 第一节 面向对象的方法一、面向对象的语言出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系。特点:是高级语言。将客观事物看作具有属性和行为的对象。通过抽象找出同一类对象的共同属性和行为,形成类。通过类的继承与多态实现代码重用。优点:使程序能够比较直接地反问题域的本来面目,软件开发人员能够利用人类认识事物所采用的一般思维方法来进行软件开发。二、程序设计方法的发展历程1面向过程的程序设计方法程序的目的:用于数学计算。主要工作:设计求解问题的过程。缺点:对于庞大、复杂的程序难以开发和维护。2面向过程的结构化程序设计方法设计思路:自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。程序结构:按功能划分为若干个基本模块,形成一个树状结构。各模块间的关系尽可能简单,功能上相对独立;每一模块内部均是由顺序、选择和循环三种基本结构组成。其模块化实现的具体方法是使用子程序。优点:有效地将一个较复杂的程序系统设计任务分解成许多易于控制和处理的子任务,便于开发和维护。缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件。具体有以下几点: 把数据和处理数据的过程分离为相互独立的实体。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 每一种相对于老问题的新方法都要带来额外的开销,程序的可重用性差。 图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。3面向对象的方法 方法: 将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体对象。 对同类型对象抽象出其共性,形成类。 类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通讯。优点: 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。 三、面向对象的基本概念1一般意义上的对象: 是现实世界中一个实际存在的事物。 可以是有形的(比如一辆汽车),也可以是无形的(比如一项计划)。 是构成世界的一个独立单位,具有: 静态特征-可以用某种数据来描述 动态特征-对象所表现的行为或具有的功能2 面向对象方法中的对象: 是系统中用来描述客观事物的一个实体,它是用来构成系统的一个基本单位。对象由一组属性和一组行为构成。 属性-用来描述对象静态特征的数据项。 行为-用来描述对象动态特征的操作序列。3分类所依据的原则抽象 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。例如,石头、树木、汽车、分类人类通常的思维方法。 房屋等都是人们在长期的生产和生活实践中抽象出的概念。4面向对象方法中的类 具有相同属性和服务的一组对象的集合。 为属于该类的全部对象提供了抽象的描述,包括属性和行为两个主要部分。 类与对象的关系:犹如模具与铸件之间的关系,一个属于某类的对象称为该类的一个实例。5 面向对象方法中的封装 把对象的属性和服务结合成一个独立的系统单元。 尽可能隐蔽对象的内部细节。对外形成一个边界(或者说一道屏障),只保留有限的对外接口使之与外部发生联系。6面向对象方法中的继承 继承对于软件复用有着重要意义,是面向对象技术能够提高软件开发效率的重要原因之一。 定义:特殊类的对象拥有其一般类的全部属性与服务,称作特殊类对一般类的继承。例如:将轮船作为一个一般类,客轮便是一个特殊类。7 面向对象方法中的多态性 多态是指在一般类中定义的属性或行为,被特殊类继承之后,可以具有不同的数据类型或表现出不同的行为。这使得同一个属性或行为在一般类及其各个特殊类中具有不同的语义。例如:数的加法-实数的加法-复数的加法第二节 面向对象的软件开发面向对象的软件工程(软件开发)是面向对象方法在软件工程领域的全面应用。它包括: 面向对象的分析(OOA) 面向对象的设计(OOD) 面向对象的编程(OOP) 面向对象的测试(OOT) 面向对象的软件维护(OOSM)一、系统分析 系统分析阶段应该扼要精确地抽象出系统必须做什么,但是不关心如何去实现。 面向对象的系统分析,直接用问题域中客观存在的事物建立模型中的对象,对单个事物及事物之间的关系,都保留他们的原貌,不做转换,也不打破原有界限而重新组合,因此能够很好地映射客观事物。二、设计 针对系统的一个具体实现运用面向对象的方法。其中包括两方面的工作: 把OOA模型直接搬到OOD,作为OOD的一部分。 针对具体实现中的人机界面、数据存储、任务管理等因素补充一些与实现有关的部分。 三、编程OOP工作就是用一种面向对象的编程语言把OOD模型中的每个成分书写出来,是面向对象的软件开发最终落实的重要阶段。四、测试 测试的任务是发现软件中的错误。 在面向对象的软件测试中继续运用面向对象的概念与原则来组织测试,以对象的类作为基本测试单位,可以更准确的发现程序错误并提高测试效率。 五、维护将软件交付使用后,工作并没有完结,还要根据软件的运行情况和用户需求,不 断改进系统。使用面向对象的方法开发的软件,其程序与问题域是一致的,因此,在维护阶段运用面向对象的方法可以大大提高软件维护的效率。 授课内容:第二章 类与对象授课时数18教学目的及要求:掌握:类定义的方法和存取级别。 掌握:类的成员变量和成员函数的定义和使用,以及对象的定义。 了解:友元函数和友元类。 掌握:构造函数和析构函数。 掌握:静态类成员变量和成员函数的定义和使用方法。 掌握:内联函数的定义和使用方法。 掌握:对象指针及对象引用的使用。 了解:容器类的定义。 掌握:在函数中对象传递的机制。教学基本内容: 类的声明,对象的定义,构造函数、析构函数,对象指针,对象引用,静态成员,友元,标识符的作用域,对象数组,成员对象,对象的存储类等。重点与难点: 类及类对象的定义,构造函数、析构函数的定义,对象指针及对象引用的使用,容器类的定义。教学方法:讲授法 讨论法 自学指导法 其他 教学手段:多媒体 实物 模型 挂图 音像 其他板书设计:讨论、思考题:1. 什么是类,什么是对象,类和对象是怎样的关系?2叙述静态成员和一般成员的区别。3什么叫友元? 什么叫友元类?什么叫友元函数?什么叫友元成员函数? 4叙述友元与类的封装性之间的关系。5友元方法有什么优点?有什么缺点?作业:见书中第四章练习参考资料(含参考书目、文献等):1、Harvey M.Deitel及Paul James Deitel著,C+大学教程(第三版),电子工业出版社。2、刘正林,面向对象程序设计,华中科技大学出版社。3、周生炳等,面向对象程序设计,清华大学出版社。4、揣锦华,面向对象程序设计与VC+实践,西安电子科技大学出版社。5、王育坚编,面向对象编程教程, 清华大学出版社。6、王萍编著,C+面向对象程序设计, 清华大学出版社出版。7、徐孝凯等编,面向对象程序设计实验, 中央广播电视大学出版社出版。第一节 C+的面向对象的概念一、抽象的概念抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。 先注意问题的本质及描述,其次是实现过程或细节。 数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。 代码抽象:描述某类对象的共有的行为特征或具有的功能。 抽象的实现:通过类的声明。二、抽象实例1日期 抽象实例 数据抽象:int Year, int Month, int Day 代码抽象:SetDate(), /设置年、月、日IsLeapYear(),/计算某年是否为闰年ShowDate(),/显示年、月、日的值抽象实例日期类class Datepublic: void SetDate(int y, int m, int d); int IsLeapDate();void ShowDate();private: int Year,Month,Day; 2钟表 抽象实例-钟表 数据抽象:int Hour, int Minute, int Second代码抽象:SetTime(), ShowTime()抽象实例钟表类class Clock public: void SetTime(int NewH, int New, int NewS); void ShowTime();private: int Hour,Minute,Second; 3抽象实例人数据抽象:char *name,char *gender,int age,int id代码抽象:生物属性角度:GetCloth(), Eat(), Step(),社会属性角度:Work(), Promote() ,二、封装将抽象出的数据成员、代码成员相结合,将它们视为一个整体。 目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。 实现封装:类声明中的实例:class Clockpublic: void SetTime(int NewH, int NewM, int NewS); void ShowTime();private:int Hour,Minute,Second;三、继承与派生是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。实现:声明派生类第七章四、多态性 多态:同一名称,不同的功能实现方式。 目的:达到行为标识统一,减少程序中标识符的个数。 实现:重载函数和虚函数第八章五、c+中的类 类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。 利用类可以实现数据的封装、隐藏、继承与派生。 利用类易于编写大型复杂程序,其模块化程度比C中采用函数更高。第二节 类的定义格式一、类的声明类是一种用户自定义类型,声明形式:class 类名称 public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员;(1)类的定义格式分为说明部分和实现部分,说明部分用来描述该类中的成员,包括数据成员和成员函数,成员函数使用来对数据成员进行操作的即“方法”,实现部分用来定义各种成员函数,描述这些成员函数如何实现队数据成员的操作。(2)类由类头和类体两部分组成。类头由关键字class和类名组成,类名是由用户定义的标识符,类头用来向便宜系统声明定义了一个新的class类型;而类体是对类的组织形式进行具体的描述,它由访问限制符(private,protected,public)、数据成员和成员函数组成,整个类体用一对大括号括起来,完整地表达对类的描述。(3)class允许隐藏内部成员,它依靠类定义中的3个访问限制符publicprivateprotected来确定隐藏的程度,它们将类体分成3 个大部分。(4)类的定义只是定义了某种类的组织形式,类似于结构体的定义,编译系统并不给class类型的每个数据成员分配具体的内存空间。二、类成员的访问控制3个访问限制符将类体分成3个大部分,每一部分都可以有数据成员和成员函数,也可以只有数据成员或只有成员函数,但不同的访问限制符规定了该部分所具有的访问权限。1Public(公有类型的成员) 在关键字public后面声明,这一部分是透明的,它的数据成员和成员函数是开放的,即可以由本类的成员函数直接访问,也可以由任何外部函数来访问,它们是类与外部的接口。外部访问是通过“对象名.公有成员名”进行。2Private(私有类型的成员)在关键字private后面声明,这一部分象一个黑盒子,完全隐藏的。它只允许本类中的成员函数直接访问(既在成员函数体内直呼其名写出成员名),象日期类Date的SetDate( )成员函数体内,可以直接写“year=y;month=m,day=d;”等语句;而类外部的任何函数都不能访问。如不允许编写成”对象名.私有成员名“形式。如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。3Protected(保护类型成员)这一部分是半透明的,与private类似,其差别表现在继承与派生时对派生类的影响不同。它可由本类成员函数或它的派生类成员函数直接访问,而其它的函数不允许访问此部分。三、数据成员与一般的变量声明相同,但需要将它放在类的声明体中。class Clockpublic: 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;void Clock : ShowTime() /显示时钟的成员函数在类体外的实现 coutHour:Minute:Second; 通常,总是将数据成员指定为私有的,以实现数据隐藏,这些数据成员用来描述该类对象的属性,编程者无法直接访问它们而隐藏起来。四、成员函数 1)成员函数说明 在类中说明原形,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。 允许声明重载函数和带默认形参值的函数。(见上面例子中成员函数的定义) 2)内联成员函数 为了提高运行时的效率,对于较简单的函数可以声明为内联形式。 内联函数体中不要有复杂结构(如循环语句和switch语句)。 在类中声明内联成员函数的方式: 将函数体放在类的声明中。 使用inline关键字。举例1: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;举例2class Point public: void Init(int initX,int initY); int GetX(); 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;一般将成员函数指定为公有的,作为该类对象访问私有数据成员的一个接口界面,即对象访问私有数据成员的一条消息通道提供给外界使用。因此,一个类的对象只能通过公有成员函数访问它的私有数据成员,从而隐藏了处理这些数据的具体实现细节,使得类对数据的描述和类提供给外界来处理数据的界面互相独立,这就给出了面向对象的重要特性。如日期类Date封装在一个程序实体内(定义日期类Date的程序代码),将它的私有数据成员year ,month,day 等隐藏起来,不让对象随意访问,对象要访问这些私有数据成员,也只有通过公有的成员函数SetDate()、IsLeapYear()和PrintDate()等才能实现。举例:Counter类用类定义一个计数器的抽象数据类型,计数器允许的取值范围为04294967295的正整数,可进行的操作是计数器加1、减1和读计数器的值。数据抽象:int value;代码抽象:Counter( );/给计数器赋初值 Increament( );/在计数器允许取值范围内对计数器加1 Decrement( );/ 在计数器允许取值范围内对计数器减1 ReadValue( );/读计数器的值 Counter( );/撤消Counter类的对象程序实现:见jsj的11.2#include 第三节 对象的定义一、对象的定义格式类的对象是该类的某一特定实体,即类类型的变量。 声明形式类名 对象名;例 Clock myClock; 访问对象成员类中成员互访:直接使用成员名。类外访问:使用“对象名.成员名”方式访问 public 属性的成员。类应用举例:#includeusing namespace std;class Clock ./类的声明略/.类的实现略int main() Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime();二、对象指针和对象引用的定义格式 1、对象指针 声明形式类名 *对象指针名;例Point A(5,10);Piont *ptr;ptr=&A; 通过指针访问对象成员对象指针名-成员名ptr-getx() 相当于 (*ptr).getx();对象指针应用举例:int main() Point A(5,10); Point *ptr; ptr=&A; int x; x=ptr-GetX(); coutxendl; return 0; 2、对象引用( 声明形式类名 &对象名=已存在的同类对象名;/给已有的对象另外取一个别名 例:Point A;Piont &B=A; 通过对象引用访问对象成员使用“对象引用名.成员名”方式访问 public属性 的成员(与使用对象名.成员名方式访问是等价的)。 举例说明:#includeusing namespace std;class Clock ./类的声明略/.类的实现略int main() Clock Clock1; Clock &myClock=Clock1;/定义对象引用 myClock.SetTime(8,30,30);/等同于Clock1. etTime(8,30,30); myClock.ShowTime();/等同于Clock1. ShowTime();第四节 对象的初始化一、构造函数 1、构造函数说明构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。在对象创建时由系统自动调用。如果程序中未声明,则系统自动产生出一个默认形式的构造函数允许为内联函数、重载函数、带默认形参值的函数。构造函数举例:class Clockpublic: Clock (int NewH, int NewM, int NewS);/构造函数 void SetTime(int NewH, int NewM, int NewS); void ShowTime();private: int Hour,Minute,Second;构造函数的实现:Clock:Clock(int NewH, int NewM, int NewS) Hour= NewH; Minute= NewM; Second= NewS;建立对象时构造函数的作用:int main() Clock c (0,0,0); /隐含调用构造函数,将初始值作为实参。 c.ShowTime();2、复制构造函数(拷贝构造函数)拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。class 类名 public : 类名(形参);/构造函数 类名(类名 &对象名);/拷贝构造函数 .;类名: 类名(类名 &对象名)/拷贝构造函数的实现 函数体 拷贝构造函数举例1:class Point public: Point(int xx=0,int yy=0)X=xx; Y=yy; Point(Point& p); int GetX() return X; int GetY() return Y; private: int X,Y;Point:Point (Point& p) X=p.X; Y=p.Y; cout拷贝构造函数被调用endl;复制构造函数举例2:当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。int main() Point A(1,2); Point B(A); /拷贝构造函数被调用 coutB.GetX()endl;复制构造函数举例3:若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:void fun1(Point p) coutp.GetX()endl; int main() Point A(1,2); fun1(A); /调用拷贝构造函数 复制构造函数举例4: 当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:Point fun2() Point A(1,2); return A; /调用拷贝构造函数int main() Point B; B=fun2(); 如果程序员没有为类声明拷贝初始化构造函数,则编译器自己生成一个拷贝构造函数。这个构造函数执行的功能是:用作为初始值的对象的每个数据成员的值,初始化将要建立的对象的对应数据成员。二、析构函数完成对象被删除前的一些清理工作。在对象的生存期结束的时刻系统自动调用它,然后再释放此对象所属的空间。如果程序中未声明析构函数,编译器将自动产生一个默认的析构函数。 构造函数和析构函数举例:#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()/.其它函数的实现略类的应用举例:一圆型游泳池如图所示,现在需在其周围建一圆型过道,并在其四周围上栅栏。栅栏价格为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; /圆面积;/ 类的实现/ 构造函数初始化数据成员radiusCircle:Circle(float r)radius=r/ 计算圆的周长float Circle:Circumference() const return 2 * PI * radius;/ 计算圆的面积 float Circle:Area() const return PI * radius * radius;void main () float radius; float FenceCost, ConcreteCost; / 提示用户输入半径 coutradius; / 声明 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 X=xx;this-Y=yy; 2、指向类的非静态成员的指针通过指向成员的指针只能访问公有成员。1)声明指向成员的指针声明指向公有数据成员的指针。类型说明符 类名:*指针名;声明指向公有函数成员的指针)类型说明符 (类名:*指针名)(参数表);指向数据成员的指针(说明指针应该指向哪个成员)指针名=&类名:数据成员名;2)通过对象名(或对象指针)与成员指针结合来访问数据成员对象名.* 类成员指针名或: 对象指针名*类成员指针名 指向函数成员的指针初始化指针名=类名:函数成员名;3)通过对象名(或对象指针)与成员指针结合来访问函数成员(对象名.* 类成员指针名)(参数表)或:(对象指针名*类成员指针名)(参数表)举例说明:访问对象的公有成员函数的不同方式int main()/主函数Point A(4,5);/声明对象APoint *p1=&A;/声明对象指针并初始化 /声明成员函数指针并初始化int (Point:*p_GetX)()=Point:GetX; /(1)使用成员函数指针访问成员函数cout(A.*p_GetX)()endl; /(2)使用对象指针访问成员函数coutGetX)()endl; /(3)使用对象名访问成员函数 coutA.GetX()endl; 3、指向类的静态成员的指针 对类的静态成员的访问不依赖于对象 可以用普通的指针来指向和访问静态成员例6-14通过指针访问类的静态数据成员#include using namespace std;class Point/Point类声明public:/外部接口Point(int xx=0, int yy=0) X=xx;Y=yy;countP+;/构造函数Point(Point &p);/拷贝构造函数int GetX() return X;int GetY() return Y;static int countP;/静态数据成员引用性说明private:/私有数据成员int X,Y;Point:Point(Point &p)X=p.X; Y=p.Y; countP+; int Point:countP=0;/静态数据成员定义性说明int main()/主函数 /声明一个int型指针,指向类的静态成员int *count=&Point:countP; Point A(4,5);/声明对象AcoutPoint A,A.GetX(),A.GetY(); /直接通过指针访问静态数据成员cout Object id=*countendl;Point B(A);/声明对象BcoutPoint B,B.GetX() ,B.GetY(); /直接通过指针访问静态数据成员cout Object id=*countendl; 例6-15通过指针访问类的静态函数成员#include using namespace std;class Point/Point类声明 public:/外部接口/其它函数略static void GetC() /静态函数成员 cout Object id=countPendl; private:/私有数据成员int X,Y;static int countP;/静态数据成员引用性说明;/ 函数实现略int Point:countP=0;/静态数据成员定义性说明int main()/主函数 /指向函数的指针,指向类的静态成员函数void (*gc)()=Point:GetC;Point A(4,5);/声明对象AcoutPoint A,A.GetX(),A.GetY();gc(); /输出对象序号,通过指针访问静态函数成员Point B(A);/声明对象BcoutPoint B,B.GetX(),B.GetY();gc(); /输出对象序号,通过指针访问静态函数成员四、递归类第六节 动态内存分配一、动态申请内存操作符 new new 类型名T(初值列表)功能:在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。结果值:成功:T类型的指针,指向新分配的内存。失败:0(NULL)二、释放内存操作符delete delete 指针P功能:释放指针P所指向的内存。P必须是new操作的返回值。例6-16 动态创建对象举例#includeusing namespace std;class Point public: Point() X=Y=0; coutDefault Constructor called.n; Point(int xx,int yy) X=xx; Y=yy; cout Constructor called.n; Point() coutDestructor called.n; int GetX() return X; int GetY() return Y; void Move(int x,int y) X=x; Y=y; private: int X,Y;int main() coutStep One:endl; Point *Ptr1=new Point; delete Ptr1; coutStep Two:endl; Ptr1=new Point(1,2); delete Ptr1; return 0;运行结果:Step One:Default Constructor called.Destructor called.Step Two:Constructor called.Destructor called.三、浅拷贝与深拷贝 浅拷贝 实现对象间数据元素的一一对应复制。 深拷贝 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。 例6-20对象的浅拷贝 #includeusing namespace std;class Point /类的声明同例6-16 /;class ArrayOfPoints /类的声明同例6-18 /;int main()int number;cinnumber; ArrayOFPoints pointsArray1(number); pointsArray1.Element(0).Move(5,10); pointsArray1.Element(1).Move(15,20); ArrayOfPoints pointsArray2(pointsArray1); coutCopy of pointsArray1:endl; coutPoint_0 of array2: pointsArray2.Element(0).GetX() , pointsArray2.Element(0).GetY()endl; coutPoint_1 of array2: pointsArray2.Element(1).GetX() , pointsArray2.Element(1).GetY()endl;pointsArray1.Element(0).Move(25,30); pointsArray1.Element(1).Move(35,40); coutAfter the moving of pointsArray1:endl; coutPoint_0 of array2: pointsArray2.Element(0).GetX() , pointsArray2.Element(0).GetY()endl; coutPoint_1 of array2: pointsArray2.Element(1).GetX() , pointsArray2.Element(1).GetY()endl;运行结果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Copy of pointsArray1:Point_0 of array2: 5, 10Point_1 of array2: 15, 20After the moving of pointsArray1:Point_0 of array2: 25, 30Point_1 of array2: 35, 40Deleting.Destructor called.Destructor called.Deleting.接下来程序出现异常,也就是运行错误。用图说明浅拷贝(见电子课件) 例6-21对象的深拷贝 #includeusing namespace std;class Point /类的声明同例6-16 ;class ArrayOfPoints public: ArrayOfPoints(ArrayOfPoints& pointsArray); /其它成员同例6-18 ;ArrayOfPoints :ArrayOfPoints(ArrayOfPoints& pointsArray) numberOfPoints =pointsArray.numberOfPoints; points=new PointnumberOfPoints; for (int i=0; inumberOfPoints; i+) pointsi.Move(pointsArray.Element(i).GetX(), pointsArray.Element(i).GetY();int main() /同例6-20 程序的运行结果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Default Constructor called.Default Constructor called.Copy of pointsArray1:Point_0 of array2: 5, 10Point_1 of array2: 15, 20After the moving of pointsArray1:Point_0 of array2: 5, 10Point_1 of array2: 15, 20Deleting.Destructor called.Destructor called.Deleting.Destructor called.Destructor called. 用图说明(见电子课件)第七节 静态成员一、静态数据成员 静态数据成员 用关键字static声明 该类的所有对象维护该成员的同一个拷贝 必须在类外定义和初始化,用(:)来指明所属的类。 举例:具有静态数据成员的Point类#include using namespace std;class Pointpublic: Point(int xx=0, int yy=0) X=xx; Y=yy; countP+; Point(Point &p); int GetX() return X; int GetY() return Y; void GetC() cout Object id=countPendl;private: int X,Y; static int countP;Point:Point(Point &p)X=p.X;Y=p.Y;countP+;int Point:countP=0; int main()Point A(4,5);coutPoint A,A.GetX(),A.GetY();A.GetC();Point B(A);coutPoint B,B.GetX(),B.GetY();B.GetC();二、静态成员函数 静态成员函数 类外代码可以使用类名和作用域操作符来调用静态成员函数。 静态成员函数只能引用属于该类的静态数据成员或静态成员函数。 静态成员函数举例1: #includeusing namespace std;class Application public
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 考试试卷


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!