第十章 构造函数和析构函数.ppt_第1页
第十章 构造函数和析构函数.ppt_第2页
第十章 构造函数和析构函数.ppt_第3页
第十章 构造函数和析构函数.ppt_第4页
第十章 构造函数和析构函数.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

1、第十章 构造函数和析构函数,1.构造函数,作用: 一个类的构造 函数将在定义该类对象时自动调用,完成给对象赋初值(对象的初始化函数) 特点: 与该类同名 不带任何返回类型,也不需要返回任何值,因为一个类的构造函数的隐含返回类型是这个类的本身。 可建立重载的多个构造函数(有参、无参、不同参数) 可建立具有默认参数值的构造函数,Class room private: float squares=0.3025; ; 在程序编译阶段会出现“类成员不能设置初值”的错误信息,解决的方式是定义一个与类名相同的函数构造函数,Examples,Class room private: float squares;

2、 float ledge; float sedge; public: room( ) squares=0.3025; ledge=6.0; sedge=4.8; room(float sq , float l , float se ); ; (续下页),room: room(float sq , float l , float se ) squares=sq; ledge=l; sedge=se; void main( ) room room1; room room2(1.2,7,6.6); ,注意:与普通函数不同的是,如果在创建对象时没有向构造函数传递实参,则在对象名的后面不需要加括号。,利

3、用构造函数进行类型转换,对于用户自定义类型数据,在一定的条件下,不同类型的数据之间可以相互转换:自动转换和强制转换。这些转换都是通过构造函数实现的。 只有一个参数的构造函数实现类型的自动转换。,【例】 只有一个参数的构造函数实现类型的自动转换class B int i; public:B()cout调用构造函数B()!n; class Aint i; public:A()cout调用构造函数A()!n;A(int a) i=a; cout i=it调用构造函数A(int)!n;A(B y,int a=10)i=a;cout i=it调用构造函数A(B)!n;,void main()A a1(1

4、0); /A A a2=20; /B a2=50; /C B b; /D A a3=b; /E a3=b; /F,i=10 调用构造函数A(int)!,i=20 调用构造函数A(int)!,i=50 调用构造函数A(int)!,调用构造函数B()!,i=10 调用构造函数A(B)!,i=10 调用构造函数A(B)!,初始化,等价于 A a2(20),类型转换,初始化,等价于 A a3(b,10),类型转换,由上例可见,当一个类能够创建带有一个实参(假设类型为T)的对象时,可进行下列操作: (1)在创建对象时可以用赋值语句进行初始化。 (2)对已创建的对象,可以将T类型的数据赋给该对象。此时会产

5、生一个临时对象,且当赋值完毕时立即撤消该临时对象。 对于多个参数的构造函数,则可利用它进行强制类型转换。 用构造函数进行类型强制转换的一般格式为: (),【例】 用构造函数进行强制类型转换class Csampleint x,y; public:CSample(int a,int b)x=a;y=b;cout“x=”xt“y=”yt“调用了构造函数!n; void main (void) CSample x1(12,105); x1=CSample(45,80); /A,拷贝构造函数,能完成拷贝功能的构造函数称为拷贝构造函数。定义拷贝构造函数的格式如下: :(const public:CPoi

6、nt( )x=0,y=0;CPoint(int vx,int vy) x=vx; y=vy; void Print()coutxtyn; void main()CPoint pt1(100,200);CPoint pt2(pt1); /ACPoint pt3=pt1; /Bpt3=pt2; /Cpt1.Print();pt2.Print();pt3.Print();,调用自动拷贝函数,调用自动拷贝函数,简单的赋值,【例】利用自定义的拷贝构造函数class Cpointint x,y; public:CPoint()x=0,y=0;CPoint(int vx,int vy) x=vx; y=vy

7、; CPoint(Cpoint ,void main()Cpoint pt1(100,200);pt1.Print();Cpoint pt2(pt1); /Apt2.Print();Cpoint pt3=pt1; /Bpt3.Print();cout标志.n;pt3=pt2; /C,调用自定义拷贝函数,调用自定义拷贝函数,简单的赋值,2.析构函数,作用: 在对象撤消时被调用,并用调用执行后才真正撤消对象。 特点: 对类名同名,函数名前再加 不允许带任何参数,不允许带返回类型 由系统执行程序时,要撤消对象时自动调用。,对于定义的非动态对象,离开它的作用域时被自动撤消,故用系统默认的析构函数即可

8、Array() 对于定义的动态对象,只有当对其执行delete操作时才撤消,否则不会自动撤消,故需自定义该析构函数。 Array() delete a; coutdestructorendl; ,构造函数和析构函数的调用时间:,【例】调用用户自定义的析构函数class A private:int i; public:A(int a) i=a; cout i=it调用了构造函数!n; A() couti=i调用了析构函数!n; ;,A a(0); /A void main()A a1(10); /BA a2=20; /Ca2=50; /Dcoutmain()函数结束!endl;,i=0 调用了构

9、造函数,i=10 调用了构造函数,i=20 调用了构造函数,main()函数结束!,i=50 调用了析构函数,i=10 调用了析构函数,i=0 调用了析构函数,【例】 用delete运算符撤消对象时调用析构函数class circle private:int r; public:circle(int a) r=a;void Print() cout“半径为:”trendl;circle() cout“r=”r“调用了析构函 数!n; ;,void main() circle c1(10); c1.Print(); circle *c2=new circle(20); c2-Print(); d

10、elete c2; /A cout结束main()函数!nendl;,半径为:10,半径为:20,r=20 调用了析构函数!,结束main()函数!,r=10 调用了析构函数!,3.使用this指针,成员函数如何正确的引用对象?,定义同一类的多个对象时,每一个对象拥有自己的数据成员,但它们共用一份成员函数,当成员函数处理对象时它们使用this指针,通过this指针指向不同对象来决定使用哪一个对象的数据成员。 *this具有如下形式的默认样式: *const this,class Sample int I; public: Sample(int j=0) I=j; /this-I=j; Samp

11、le add(int k) I+=K; /this-I+=k; return *this; void Display() coutIendl; cout“the value of this ”thisendl; ;,void main() Sample A1(10); A1.Display(); Sample A2=A1.add(5); A2.Display(); ,运行结果: i=10 the value of this=oxfff4,i=15 the value of this=oxfff2,4.对象成员,一个数据成员定义为另一个类的对象对象成员 创建类对象时,也要创建对象成员;用构造函数

12、初始化嵌套对象时,也要用对象成员的构造函数初始化对象成员。用初始化成员列表传递对象成员构造函数所需的参数。,class CEmbedded public: CEmbedded( int Param1, int Param2) / ; class Ccontainer private: CEmbedded embed; public: CContainer( int p1, int p2, int p3):embed(p1,p2) / ;,class A int x,y; public: A(int a,int b) x=a;y=b; void show( ) coutx=xty=yn; ; c

13、lass B int Length,Width; public: B(int a,int b) Length=a;Width=b; void show( ) coutLength=Lengthtwidth=Widthn; ;,【例】 对象成员,class C int r,High; A a1; B b1; public: C(int a,int b,int c,int d):a1(c,d), b1(500,600) r=a;High=b; void show( ) coutr=rtHigh=Highn;a1.show( ); b1.show( ); ; void main(void) C c1(100,200,300,400); c1.show( ); ,R=100 high=200 x=300 y

温馨提示

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

评论

0/150

提交评论