第9章 对象生灭C++_第1页
第9章 对象生灭C++_第2页
第9章 对象生灭C++_第3页
第9章 对象生灭C++_第4页
第9章 对象生灭C++_第5页
已阅读5页,还剩64页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、HPU面向对象程序面向对象程序设计设计第九章 对象生灭 Chapter 9Chapter 9 Object Birth & DeathObject Birth & Death第第9 9章章 内容内容构造函数设计构造函数设计( Constructor Design ) 1构造函数的重载构造函数的重载 ( Constructor Overload ) 2类成员初始化类成员初始化 ( Class Member Initialization ) 3构造顺序构造顺序 ( Construction Order )4拷贝构造函数拷贝构造函数 ( Copy Constructor )5析构函数

2、析构函数 ( Destructors ) 6对象转型与赋值对象转型与赋值 (Object Conversion & Assignment )7第第9 9章章 内容内容9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v1. 初始化要求初始化要求 例例6:f0807.cpp 例例7:f0901.cpp 变量:创建时不用赋值,参与运算再赋值。变量:创建时不用赋值,参与运算再赋值。 对象:与变量的不同在于对象对应于事物对象:与变量的不同在于对象对应于事物,要求从诞生之时起便有明确的意义。要求从诞生之时起便有明确的意

3、义。9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v2. 封装性要求封装性要求 结构体对象与类对象访问数据的差异结构体对象与类对象访问数据的差异9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v2. 封装性要求封装性要求 结构体对象与类对象访问数据的差异结构体对象与类对象访问数据的差异 封装性要求对象创建中按传递的信息进行封装性要求对象创建中按传递的信息进行一个过程化的初始化工作。初始化不是简一个过程化的初始化工作。初始化不是简单的参

4、数与成员对应,而是联系参数到成单的参数与成员对应,而是联系参数到成员的过程员的过程9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v3. 函数形式(构造函数)函数形式(构造函数) 特殊的成员函数。特殊的成员函数。 构造函数的作用是在对象被创建时使用特定的值构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象构造对象,或者说将对象初始化初始化为一个特定的状为一个特定的状态。态。 在对象创建时在对象创建时由系统自动调用由系统自动调用。 如果程序中未声明,则系统自动产生出一个如果程序中未声明,则系统自动产生出

5、一个默认默认形式形式的构造函数的构造函数 允许为允许为内联内联函数、函数、重载重载函数、函数、带默认形参值带默认形参值的函的函数。数。9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v3. 函数形式(构造函数)函数形式(构造函数) 例例8:构造函数的声明,实现,调用:构造函数的声明,实现,调用class Clockpublic:Clock (int NewH, int NewM, int NewS);/构造函数构造函数void SetTime(int NewH, int NewM, int NewS);void S

6、howTime();private:int Hour,Minute,Second;9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v3. 函数形式(构造函数)函数形式(构造函数) 例例8:构造函数的声明,实现,调用:构造函数的声明,实现,调用构造函数的实现:Clock:Clock(int NewH, int NewM, int NewS)Hour= NewH;Minute= NewM;Second= NewS;9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor

7、 Design ) )v3. 函数形式(构造函数)函数形式(构造函数) 例例8:构造函数的声明,实现,调用:构造函数的声明,实现,调用建立对象时构造函数的作用:void main() Clock c (0,0,0); /隐含调用构造函数,将初隐含调用构造函数,将初始值作为实参。始值作为实参。 c.ShowTime();9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v4. 无返回值无返回值 构造函数原则上不能失败,也没有返回形构造函数原则上不能失败,也没有返回形式。式。 构造函数是类型名称引导的定义语句,不构造函数

8、是类型名称引导的定义语句,不是无返回值的函数调用语句。是无返回值的函数调用语句。 构造函数也不是无类型构造函数也不是无类型(void)函数函数9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v5. set的遗憾的遗憾 例例9:f0811.cpp 例例10:f0902.cpp9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v6. 一次性对象一次性对象 创建对象不给出对象名创建对象不给出对象名 直接以类名调用构造函数,则产生一个无直接以类名

9、调用构造函数,则产生一个无名对象名对象 无名对象经常在参数传递时用到无名对象经常在参数传递时用到9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v总结总结9.1 9.1 构造函数设计构造函数设计( Constructor Design( Constructor Design ) )v练习练习1:构造函数的调用:构造函数的调用9.2 9.2 构造函数的重载构造函数的重载( Constructor Overload( Constructor Overload ) )v1. 重载构造函数重载构造函数 允许为允许为内联内联

10、函数、函数、重载重载函数、函数、带默认形参带默认形参值值的函数。的函数。 例例11:f0903.cpp9.2 9.2 构造函数的重载构造函数的重载( Constructor Overload( Constructor Overload ) )v1. 重载构造函数重载构造函数 允许为允许为内联内联函数、函数、重载重载函数、函数、带默认形参带默认形参值值的函数。的函数。 例例11:f0903.cpp9.2 9.2 构造函数的重载构造函数的重载( Constructor Overload( Constructor Overload ) )v1. 重载构造函数重载构造函数 几点区别几点区别9.2 9.

11、2 构造函数的重载构造函数的重载( Constructor Overload( Constructor Overload ) )v2. 默认构造函数(无参构造函数)默认构造函数(无参构造函数) 没有定义构造函数的类则提供默认没有定义构造函数的类则提供默认9.2 9.2 构造函数的重载构造函数的重载( Constructor Overload( Constructor Overload ) )v总结总结9.2 9.2 构造函数的重载构造函数的重载( Constructor Overload( Constructor Overload ) )v练习练习2:构造函数的重载:构造函数的重载9.3 9.

12、3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initialization ) )v1. 默认调用的无参构造函数默认调用的无参构造函数 例例12:f0905.cpp 实质:实质:类中包含子对象的构造函数调用类中包含子对象的构造函数调用9.3 9.3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initialization ) )v1.默认调用的无参构造函数默认调用的无参构造函数 (1) 当一个类中包含子对象时,构造函数的当一个类中包含子对象时,构造函数的调用

13、顺序是调用顺序是先调用子对象的构造函数先调用子对象的构造函数(按(按照它们在照它们在类定义时出现的顺序类定义时出现的顺序),然后),然后再再调用当前对象的构造函数调用当前对象的构造函数代码。代码。 (2) 对于想使用无参构造函数的子对象,可对于想使用无参构造函数的子对象,可以不出现在构造列表中,系统自动调用它以不出现在构造列表中,系统自动调用它的无参构造函数。的无参构造函数。9.3 9.3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initialization ) )v2. 初始化的困惑初始化的困惑 例例13:f0906.c

14、pp9.3 9.3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initialization ) )v3. 成员的初始化成员的初始化 构造函数的构造参数表构造函数的构造参数表9.3 9.3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initialization ) )v3. 成员的初始化成员的初始化 例例14:9.3 9.3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initializat

15、ion ) )v总结总结9.3 9.3 类成员初始化类成员初始化( Class Member Initialization( Class Member Initialization ) )v练习练习39.4 9.4 构造顺序构造顺序( Constructing Order( Constructing Order ) )v1. 局部对象局部对象 定义:局部和静态对象是指块作用域(局定义:局部和静态对象是指块作用域(局部作用域)和文件作用域的对象。它们声部作用域)和文件作用域的对象。它们声明的顺序和它们在程序中出现的顺序是一明的顺序和它们在程序中出现的顺序是一致的。致的。 例例15:f0908.c

16、pp9.4 9.4 构造顺序构造顺序( Constructing Order( Constructing Order ) )v2. 全局对象全局对象 定义:和全局变量一样,所有全局对象在定义:和全局变量一样,所有全局对象在主函数启动之前,全部被构造。主函数启动之前,全部被构造。 例例16:9.4 9.4 构造顺序构造顺序( Constructing Order( Constructing Order ) )v3. 成员对象成员对象 见见9.3.1节节 例例17:9.4 9.4 构造顺序构造顺序( Constructing Order( Constructing Order ) )v4. 构造位

17、置构造位置 (1) 全局数据区:全局、常、静态全局数据区:全局、常、静态 (2) 栈区:局部栈区:局部 (3) 堆区:动态内存堆区:动态内存 (4) 特殊地址空间:特殊地址空间:9.4 9.4 构造顺序构造顺序( Constructing Order( Constructing Order ) )v总结总结9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v1. 定义定义 拷贝构造函数是一种特殊的构造函数,

18、其形参为本类的对象引用。class 类名 public : 类名(形参);/构造函数 类名(类名类名(类名 &对象名);对象名);/拷贝构造函数拷贝构造函数 .;类名类名: 类名(类名类名(类名 &对象名)对象名)/拷贝构造函数的实现拷贝构造函数的实现 函数体函数体 9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v1. 定义定义 例例4:拷贝构造函数的声明及实现:拷贝构造函数的声明及实现class Point public: Point(int xx=0,int yy=0)X=xx; Y=yy; Poin

19、t(Point& p); int GetX() return X; int GetY() return Y; private: int X,Y;9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v1. 定义定义 例例4:拷贝构造函数的声明及实现:拷贝构造函数的声明及实现Point:Point (Point& p) X=p.X; Y=p.Y; cout拷贝构造函数被调用拷贝构造函数被调用endl;9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor )

20、 )v2. 调用调用 (1) 当用类的一个对象去初始化该类的另一个对象时系统自动调用拷贝构造函数实现拷贝赋值。void main(void) Point A(1,2); Point B(A); /拷贝构造函数被调用拷贝构造函数被调用 coutB.GetX()endl;9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v2. 调用调用 (2) 若函数的形参为类对象,调用函数时,实参赋值给形参,系统自动调用拷贝构造函数。例如:void fun1(Point p) coutp.GetX()endl; void main() Poi

21、nt A(1,2); fun1(A); /调用拷贝构造函数调用拷贝构造函数 9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v2. 调用调用 (3) 当函数的返回值是类对象时,系统自动调用拷贝构造函数。例如:Point fun2() Point A(1,2); return A; /调用拷贝构造函数调用拷贝构造函数void main() Point B; B=fun2(); 9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v3. 对象本体与实体对象本体

22、与实体 例例5:9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v3. 对象本体与实体对象本体与实体 例例6:9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v3. 对象本体与实体对象本体与实体 例例7:f0911.cpp9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v4. 默认拷贝构造函数默认拷贝构造函数9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructo

23、r( Copy Constructor ) )v4. 默认拷贝构造函数默认拷贝构造函数 例例8:f0912.cpp9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v5. 自定义拷贝构造函数自定义拷贝构造函数 例例9:f0913.cpp9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v总结总结 (1) 在定义一个类时,系统自动创建一个默在定义一个类时,系统自动创建一个默认的拷贝构造函数,但是如果程序员自己认的拷贝构造函数,但是如果程序员自己定义了同样的带

24、一个类引用参数的构造函定义了同样的带一个类引用参数的构造函数,则系统不提供默认的拷贝构造函数。数,则系统不提供默认的拷贝构造函数。 (2) 当用传值形式传递对象时,对形参的初当用传值形式传递对象时,对形参的初始化要调用对象的拷贝构造函数。始化要调用对象的拷贝构造函数。9.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v练习练习19.5 9.5 拷贝构造函数拷贝构造函数( Copy Constructor( Copy Constructor ) )v练习练习29.5 9.5 拷贝构造函数拷贝构造函数( Copy Constru

25、ctor( Copy Constructor ) )v补充:浅拷贝与深拷贝补充:浅拷贝与深拷贝 浅拷贝浅拷贝 实现对象间数据元素的一一对应复制。 深拷贝深拷贝 当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。9.5 9.5 拷贝构造函数拷贝构造函数浅拷贝浅拷贝#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 ca

26、lled.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;class ArrayOfPoints public: ArrayOfPoints(int n) numberOfPoints=n; points=new Pointn; ArrayOfPoints() coutDeleting.number; ArrayOfPoints pointsArray1(number); pointsArr

27、ay1.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.El

28、ement(1).GetY()endl;9.5 9.5 拷贝构造函数拷贝构造函数浅拷贝浅拷贝 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(

29、1).GetX() , pointsArray2.Element(1).GetY()endl;9.5 9.5 拷贝构造函数拷贝构造函数浅拷贝浅拷贝运行结果如下: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, 30Poi

30、nt_1 of array2: 35, 40Deleting.Destructor called.Destructor called.Deleting.接下来程序出现异常,也就是运行错误。9.5 9.5 拷贝构造函数拷贝构造函数浅拷贝浅拷贝拷贝前拷贝前pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray1pointsnumberOfPointspointsArray1pointsArray1的数组元素占用的内存pointsnumberOfPointspointsArray2拷贝后拷贝后9.5 9.5 拷贝构造函数拷贝构造函数深拷贝深拷贝#i

31、ncludeusing 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;class ArrayOfPoints p

32、ublic: public: ArrayOfPoints(ArrayOfPoints& pointsArray); ArrayOfPoints(int n) numberOfPoints=n; points=new Pointn; ArrayOfPoints() coutDeleting.endl; numberOfPoints=0; delete points; Point& Element(int n) return pointsn; private: Point *points; int numberOfPoints;9.5 9.5 拷贝构造函数拷贝构造函数深拷贝深拷贝A

33、rrayOfPoints :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();void main() /同浅拷贝 9.5 9.5 拷贝构造函数拷贝构造函数深拷贝深拷贝程序的运行结果如下:Please enter the number of points:2Default Constructor called.Default Constructor called.Default Constructor called.Default Constructor called.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论