




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,四、析构函数(destructor)五、赋值运算符函数operator=六、成员函数重载七、缺省参量的成员函数八、编译器默默提供的成员函数,第15章特殊的成员函数,2,四、析构函数(destructor)析构函数是类中的特殊成员函数。析构函数与构造函数的作用相反,构造函数在对象的定义点由编译器自动调用,析构函数则是在对象生存期结束时自动执行的成员函数。析构函数的语法格式是在无参构造函数的构造函数名前加以一个波浪符也即按位求反运算符,由此形成特殊的析构函数名,表示“反构造函数”。若没有提交析构函数,编译器暗中生成一个公共的缺省析构函数,它是空函数。,3,析构函数在类中的声明和定义格式为:CType();析构函数名();类名();/声明格式CType:CType()类名:类名()/定义格式析构函数语句序列;/语句为空时对应缺省的析构函数上面析构函数的定义放置在实现文件中,放在类的声明中时写为:CType()语句序列;类名()语句序列;,4,构造、析构函数和赋值运算符函数都不参入继承机制。下面是析构函数的特殊之处:1).析构函数是唯一的,既没有入口参数也无返回类型,因此不能重载。2).析构函数不能继承但可以是虚函数。3).析构函数体中不能使用return语句返回值。4).new运算符定义的对象,delete运算符清除时导致析构函数的隐含调用。,5,new运算符定义对象时new运算符先申请内存然后调用构造函数。由delete清除new运算符定义的对象时,则是先调用析构函数,然后再收回原来由new运算符为对象分配的内存。newCTypen运算分配内存大小是n*sizeof(CType),并不包含其成员指针其后所间接在构造函数中进一步获得的内存,这片内存应由析构函数先行释放。newCTypen运算符与delete匹配,newCType运算符与delete匹配,其余的搭配都是不稳健的,应避免。匹配关系为CType*pk=newCType2;.;deletepk;与CType*p=newCType;.;deletep;。delete运算符隐含调用析构函数时,在调用点相应的析构函数应是可访问的。,6,例对象定义与析构函数#includestaticintnumc=0;classCTypepublic:CType(int=3);CType();private:long*m_p;intm_n;CType:CType(intn)m_n=n;printf(%d,CType();+%dn,m_n,+numc);m_p=newlongm_n;,7,CType:CType()printf(%d,CType();%d-;,m_n,numc-);deletem_p;CTypeg(1);CType*q=newCType(9);voidmain()/因此相应的析构函数未被调用printf(Enterintomain()n);CTyped(2);CType*pk=newCType2;deletepk;printf(nGooutofmain()n);,8,/程序运行输出结果:1,CType();+19,CType();+2Enterintomain()2,CType();+33,CType();+43,CType();+53,CType();5-;3,CType();4-;Gooutofmain()2,CType();3-1,CType();2,9,说明:全局对象的构造函数在进入主函数之前就被系统优先调用,这是C+程序相对于C程序一个重要的突破。析构函数按照与构造函数相反的次序隐含地被系统调用,最先登陆构造的对象最后经过析构函数撤离现场。程序5次调用构造函数,4次调用析构函数。,10,五、赋值运算符函数operator=赋值运算符函数也称为等号运算符函数,赋值运算符的函数原型为:B函数原型说明一个函数名为operator=的运算符函数,B:operator=是这个函数的全限定名,表示:operator=函数是属于类B的成员函数,圆括号包括的是constBpublic:B(intv=1)Set(v);B(constB,12,Bn=100,13,拷贝构造函数和等号赋值函数其内在机制是一样的,memcpy函数完成幕后数据拷贝。等号语法a=d,d=a派生出两种语义,编译器根据周边氛围确定调用合适的函数,在对象的定义点调用与初始化过程相关的拷贝构造函数,在其余的环境调用等号赋值运算符函数。,14,例拷贝构造函数的隐含作用classApublic:A(intn)m_n=n;A()private:A(constA,15,A类中拷贝构造函数声明为私有的,对象定义语句Aa=d;等价于Aa(d);,a(d)调用拷贝构造函数。拷贝构造函数是私有的,定义语句导致外部访问私有的成员,因而弹出错误提示。在函数对象数值形参入口f(Aa)和对象数值返回returnA(n)时要求一个可访问的拷贝构造函数。函数f(Aa)是对象数值形参,调用f(b)引起拷贝构造函数的调用,如果在虚实结合处不存在可访问的拷贝构造函数,则导致错误提示。,16,六、成员函数重载类中的成员函数如全局函数一样可以重载。析构函数是唯一的,不能重载的函数是析构函数。成员函数允许重载(overloading)其含义以两个重载函数为例:typeCType:funct(t1v1,t2v2,tnvn)语句序列;typeCType:funct(type3v1,type4v2,typemvn)语句序列;,17,重载的成员函数是全限定名CType:funct相同形参列表类型、个数、位置有所不同的成员函数。成员函数重载在函数的调用点根据实参的类型和位置差异在编译阶段确定。CType:用于函数名的名称界定,因此另一个类中同名的成员函数funct是绝然不同的函数,正是类域分辨符减少了同名函数的混乱,这就是封装的优点。,18,例CRect类中的重载函数SetRect#include#includeclassCRectpublic:longleft;longtop;longright;longbottom;CRect(intl=1,intt=2,intr=3,intb=4);voidSetRect(intx1,inty1,intx2,inty2);voidSetRect(constCRect,19,voidCRect:Show()printf(left=%d,top=%d,right=%d,bottom=%d;,left,top,right,bottom);voidCRect:SetRect(constCRect,20,voidCRect:SetRect(intl,intt,intright,intbottom)left=l;top=t;this-right=right;this-bottom=bottom;voidmain()CRectr,s;r.Show();r.SetRect(5,6,7,8);s.SetRect(r);s.Show();/输出:left=1,top=2,right=3,bottom=4;left=5,top=6,right=7,bottom=8,21,七、缺省参量的成员函数缺省参量的函数是形参列表参量具有事先预定的值,这给编程带来的好处是:首先提醒程序员合适的实参值大抵在什么范围;其次缺省参量对于函数的使用提供了方便,只需将缺省值作为实参带入函数就能得到一致的结果。对于带有缺省值的如下函数原型:longCType:Set(intn,longm=10,shorts=5);CType:CType(intn,longm=10,shorts=5);在不引起重载调用歧义的情况下存在如下等价的调用格式:this-Set(7);this-Set(7,10);this-Set(7,10,5);CTypea(7);CTypea(7,10);CTypea(7,10,5);,22,例缺省参量的构造函数和成员函数#includeclassCTypelongm;intn;shorts;public:voidSet(intn,longm=10,shorts=5);CType(intn=1,longm=10,shorts=5);voidShow();CType();voidCType:Set(intn,longm,shorts)this-n=n;this-m=m;this-s=s;CType:CType(intn,longm,shorts)Set(n,m,s);voidCType:Show()printf(%d,%d,%dn,n,m,s);,23,voidmain()CType*pthis=newCType(1);pthis-Set(7,10,5);pthis-Show();pthis-Set(7,10);pthis-Show();CTypea(7,10,5);a.Show();CTypec(7,10);c.Show();为避免重载的歧义性,无参构造函数和全部设置缺省值的构造函数只提交一个版本。虽然两者都提供并不算错,但编译器提出警告。对象定义CTypeb;既可以调用无参构造函数也可以调用全部设置缺省值的构造函数;两者都是缺省构造函数。,24,八、编译器默默提供的成员函数对一个简单的类声明classCTypelongm_tData;,编译器暗中提交无参构造函数、析构函数、拷贝构造函数、赋值运算符函数以及一对取地址运算符函数。取地址运算函数存在一个只读成员函数,该函数用const关键此后置限定,用于取只读对象的地址。这些成员函数是公共访问性质的,仅在程序调用时才隐含生成不露声色。,25,编译器默默奉献的成员函数清单如下:#include#includeclassCTypelongm_tData;public:CType()CType()CType(constCType,26,intand=0;CType:CType(const
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025广东惠州市惠阳区教育局选调下属事业单位工作人员15人考前自测高频考点模拟试题及答案详解(各地真题)
- 2025贵州安顺参加“第十三届贵州人才博览会”引才模拟试卷及答案详解(名师系列)
- 2025福建三明市教育局部分直属单位选聘5人(二)模拟试卷有答案详解
- 2025年4月广东潮州市第三人民医院招聘编外人员49人模拟试卷及完整答案详解
- 2025广东连平县田源镇人民政府招聘编外人员1人考前自测高频考点模拟试题及完整答案详解
- 2025湖南长沙宁乡市中医医院公开招聘编外聘用人员20人考前自测高频考点模拟试题附答案详解(典型题)
- 2025昆明市公有房屋管理中心劳务派遣人员(2人)模拟试卷及答案详解一套
- 2025安徽工程大学博士专职辅导员招聘2人模拟试卷及一套完整答案详解
- 2025年中共南平市委党校紧缺急需专业教师招聘考前自测高频考点模拟试题附答案详解(突破训练)
- 2025昆明市五华区某政府单位行政辅助岗位人员招聘(2人)模拟试卷附答案详解(突破训练)
- 2025年宪法知识竞赛试题库(含答案)
- 2025年专业服务行业专业咨询服务市场前景展望报告
- GB 5725-2025坠落防护安全网
- 2025海南三亚市市场监督管理局招聘下属事业单位工作人员5人考试参考试题及答案解析
- 2025年高考真题分类汇编选择性必修一 《当代国际政治与经济》(全国)(解析版)
- 2025中国银行校招笔试真题及答案
- 钛合金课件教学课件
- 钢厂安全用电培训课件
- (完整版)高压成套配电柜安装施工方案
- 隧道运营安全培训
- 2024城市综合管廊工程技术标准
评论
0/150
提交评论