构造函数和析构函数总论_第1页
构造函数和析构函数总论_第2页
构造函数和析构函数总论_第3页
构造函数和析构函数总论_第4页
构造函数和析构函数总论_第5页
已阅读5页,还剩38页未读 继续免费阅读

下载本文档

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

文档简介

构造函数和析构函数总论,在类中可以定义两个指定功能成员函数:构造函数析构函数一、构造函数用来生成对象,可以初始化对象的数据成员,构造函数在有对象生成时有系统自动调用。,classcrectangleprivate:intleft;intright;public:crectangle(intL,intR)/构造函数left=L;right=R;voidgetcoord(int*L,int*R)*L=left;*R=right;,voidmain()intleft;intright;crectanglerect(25,100)rect.getcoord(,注:1、构造函数与类同名,定义构造函数时,不能指定返回值。2、构造函数在生成类对象时自动调用。3、new操作符自动调用生成对象的构造函数。crectangle*prect=newrectangle(25,100);这是new比malloc函数的一个重要优势。,说明:如果用户在定义类时不定义构造函数,系统会自动生成一个没有参数的空构造函数,其功能是仅仅生成对象(不对对象进行初始化)用户可以在定义类时定义构造函数,它可以是带参数的,也可以是不带参数的;也可以定义多个构造函数,即构造函数允许重载。如果有用户定义的构造函数,编译系统将不会自动生成默认的构造函数。,例:classcrectangleprivate:intleft;inttop;intright;intbottom;public:crectangle()/缺省构造函数left=top=right=bottom=0;crectangle(intL,intT,intR,intB)/构造函数left=L;top=T;right=R;bottom=B;crectanglerect1,rect2(5,5,20,20);,调用缺省构造函数,调用构造函数,二.析构函数,1、析构函数:用来释放对象,在对象删除前,用它来做一些清理工作,它在类对象销毁时自动调用。,例:include“stringh”#include”iostream.h”classCMessageprivate:char*Buffer;public:CMessage()Buffer=newchar(0);CMessage()deleteBuffer;,注:(1)析构函数在对象销毁时由系统自动调用(2)析构函数与类同名,前面加上号。(3)和构造函数一样,析构函数不能定义返回类型。(4)与构造函数不同的是,析构函数不能接收参数。(5)如果类中没有定义析构函数,编译系统会自动生成缺省析构函数。(6)析构函数不能重载。(7)一个类中只能定义一个析构函数。,2、何时调用构造函数和析构函数。构造函数在对象生成时调用析构函数在对象销毁时调用特定类型对象构造函数和析构函数的调用:对全局定义的对象:构造函数在程序开始运行时调用,即在main接到控制前调用;相应的析构函数在程序结束时调用。对于局部定义的对象:构造函数在流程到达对象定义时调用;相应的析构函数在流程走出定义对象的函数时(即走出对象的作用域时)调用。,对于用static关键字局部定义的局部静态对象:构造函数在控制首次到达对象定义时调用,析构函数在程序结束时调用。对于用new操作符动态生成的对象:构造函数在对象生成时调用,析构函数在对象用delete操作符明确销毁时调用(如果不明确销毁对象,则析构函数永远也不调用),调用构造函数和析构函数的顺序总结,对于相同域中的对象:先构造的后析构,后构造的先析构。,静态(static)类成员,一、静态数据成员1、定义:classCTestpublic;staticintcount;CTestrect1,rect2,/定义多个对象注:无论生成多少个CTest对象,只有一个count,因此它是由所有CTest对象共有的。静态数据成员只存储一处,供所有对象共用。静态数据成员能够实现多个对象的数据共享。,2、初始化可以在类外定义且函数外初始化。intCTest:count=0;3、访问:直接用类名和作用域操作符voidmain()CTest:count=1;,类名,作用域运算符,成员名,注:静态数据成员在类外定义和初始化。访问时,可以用类名和作用域操作符引用。(对象可以不存在),也可以用对象名和作用域操作符引用。和全局变量一样,它也可以在函数外定义和初始化。静态成员,使得各对象之间有了数据共享的通道,比全局变量的封装效果好。,二、静态成员函数,1、定义:classCTeststaticintgetcount();2、调用:voidmain()intCount=CTest:getcount();,注:调用时用类名和作用域操作符,而不用类对象调用。静态成员函数只能直接引用静态数据成员和属于其类的静态成员函数,非静态数据成员不能直接引用,只能通过对象引用。静态数据成员和成员函数可用于维护类中的所有对象共享的数据项。,例:includeiostreamhclassCtestprivate:staticintcount;/静态数据成员public;CTest()+count;CTest()-count;staticintGetcount()/静态成员函数returncount;,静态数据的引用,intCTest:Count=0;voidmain()coutCTest:Getcount()“objectexistn”;CTestTest1;CTest*Ptest2=newCTest;/调用构造函数coutCTest:GetCount()“objectexistn”;deletePtest2;/调用析构函数coutCTest:getcount()“objectexistn”;,静态数据的初始化,静态函数的调用,const对象和const成员函数,对象定义中加入const,表示该对象为常对象,常对象中的数据成员为常变量,不能改变该类中任何数据成员的值,数据成员必须有初值。常对象用来保护对象中的数据不被修改;类中的函数定义中加入const,表示该函数为常成员函数,只能引用本类中的数据成员,而不能不能改变它们。常对象只允许调用常函数。类中的数据成员定义中加入const,表示该数据成员为常数据成员,其值是不能改变的,只能通过构造函数的成员初始化表对其进行初始化。,例:11.13#includeclassRpublic:R(intrl,intr2)Rl=rl;R2=r2;voidprint();voidprint()const;private:intR1,R2;voidR:print()coutR1:R2endl;voidR:print()constcoutR1;R2endl;voidmain()Ra(5,4);a.print();constRb(20,52);b.print();,常数据成员常数据成员只能通过成员初始化列表的方式来生成构造函数,对数据成员初始化。,例:11.14#includeclassApublic:A(inti);voidprint();constint,A:A(inti):a(i),r(a)voidA:print()couta:rNCTest(inti)N=x;;voidmain()CTestTest1(1);CtestTest2(2);coutTest1.GetN()endl;coutTest2.GetN()endl;,this指针是隐含在成员函数体中的指针,它指向调用该成员函数的对象。,说明:this指针是指向本对象的指针,包含在成员函数内,成员函数中访问的数据成员是指,本对象的数据成员。注:由于静态成员函数不属于某个对象,所以没有包含对象地址的this指针。因此,如果要直接访问非静态数据成员,则编译器无法确定该数据成员属于哪个对象。,友元,1、可以声明某个函数为该类的友元,一旦函数声明为该类的友元,友元函数可以访问类中的私有成员。2、可以声明一个类是另一个类的友元类,友元类可以访问该类中的私有成员。注:友元提高了程序的运行效率,但破坏了封装性。,#includeiostream.h#includemath.hclasssquarpublic:squar(doublexx,doubleyy)x=xx;y=yy;voidGetxy();frienddoublearea(squar,一、友元函数声明函数时前面加friend的函数就是友元函数,友元函数是在类外定义的函数,在友元函数中可以引用类中的private成员。,二、友元类在类中声明另一个类为该类的友元类,声明前加friend。在友元类中可以引用该类中的private成员。p12311.18,#includeiostream.hclassXfriendY;public:voidSet(inti)x=i;voidDisplay()coutx=xy=yendl;private:intx;stasticinty;classYpublic:Y(inti,intj);voidDisplay();private:Xa;intX:y=1;,Y:Y(inti,intj)a.x=i;/访问X对象中的私有成员X:y=j;voidY:Display()coutx=a.x,;couty=X:yendl;voidmain()Xb;b.Set(2);b.Display();Yc(6,9);c.Display();b.Display();,11.8类的作用域:局部类、嵌套类,一、类的作用域类域:类的作用域,它是指在类的定义中由一对花括号所括起来的部份。注:类域中定义的变量不能使用auto,register,extern修饰符。只能用static修饰符,定义的函数也不能用extern.,二、局部类和嵌套类1、局部类:在函数体内定义的类为局部类。Voidfun()classA注:局部类中不能说明静态成员函数,并且所有成员函数都必须定义在函数体内,很少用。,2、嵌套类classApublic:classBprivate:,三.对象的生存期,1、局部对象:该对象所在函数块进入时,该对象被创建。该对象所在函数块退出时,该对象被释放。2、静态对象:程序第一次执行到所定义的对象时,该对象被创建。程序结束退出时,该对象被释放。3、全局对象;程序开始时,创建该对象。程序结束时,释放该对象。,11.9对象指针和对象引用,一、成员的指针,对象的指针,对象的引用成员的指针指向数据成员的指针指向成员函数的指针定义一个指向类A中数据成员C的指针方法如下:intA:*pc=,例:11.19#includeiostreamhclassApublic:A(inti)a=i;intfun(intb)returna*c+b;intc;private:inta;,voidmain()Ax(8);intA:*PC;/定义一个指向数据成员的指针PC=/用对象指针引用成员函数指针调用函数,实参5,注:P对象指针、x为对象,P指向x引用数据成员可以有下面几种形式:P为指向对象x的指针PC;x.C;对成员函数的调用可以有下面几种形式(pfun为指向成员函数fun的指针)Pfun(5);x.fun(5);Aprivate:;DATEdate2=DATE(7,22,1998),DATE(7,23,1998);或:DATEdate2;date0=DATE(7,22,1998);date1=DATE(7,23,1998);,注:数组生成时,编译器调用数组中每个元素的构造函数或缺省构造函数,数组销毁时,编译器调用每个元素的析构函数。注:如果该类没有缺省构造函数,则会产生错误。(2)数组元素赋初值时,date0=DATE(7,22,1998);会有一个临时的对象产生,调用构造函数,初始化临时对象,之后将临时对象的值赋给date0,然后调用析构函数,释放掉临时对象。,(3)用new生成的数组不能初始化(动态数组)。DATE*date=newDATE2;销毁时要加上。Deletedate;如果省略了,则编译器只对第一个数组元素调用析构函数。P12611.21,二、对象数组行指针和指针数组1、行指针classM;voidmain()Mm24M(*pm)4=m;/pm为行指针(*(pm+i)+j)为mij,二、指针数组Mm1(7,8),m2,m3(5,7);M*n3=p1826.9,作业:1.生成一个rectangle类,这个类的length和width默认为1,其成员函数计算长方形的perimeter(周长)和area(面积)。为该类的length和width设置setcoord()和getcoord()函数。setcoord()函数应验证length和width均为0.0到20.0之间的浮点数。2.生成一个savingsaccount类。用stat

温馨提示

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

评论

0/150

提交评论