




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
UML与程序设计(C++)第4章
堆与拷贝结构函数4.1关于堆C++程序内存格局通常分为四个区:全局数据区代码区栈区堆区全局变量、静态数据、常量存放在全局数据区;全部类组员函数和非组员函数代码存放在代码区;为运行函数而分配局部变量、函数参数、返回数据、返回地址等存放于栈区;余下空间作为堆区。4.2需要new和delete原因从C++立场来看,不使用malloc()函数原因是它在分配空间时候不能调用结构函数。类对象建立包含分配空间、结构结构以及初始化,这些是由结构函数统一完成。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); //… free(pD);}classTDate{public:TDate();//结构函数voidSetDate(inty,intm,intd);intIsLeapYear();voidPrint();private:intyear,month,day;};4.2需要new和delete原因假如结构函数被调用,则须在进行内存分配malloc()调用时进行,而malloc()仅是一个函数调用,没有足够信息调用结构函数。pD从malloc()取得只是一个含有随机数据类对象空间,须在内存分配之后再进行初始化。voidfn(){ Tdate*pD; pD=(Tdate*)malloc(sizeof(TDate)); pD->SetDate(,1,1); //… free(pD);}4.3分配堆对象C++new和delete机制更简单易懂。voidfn(){ Tdate*pS; pS=newTDate;
//分配堆空间并结构 //… deletepS;//析构并将空间返还给堆}假如分配局部对象,则在该局部对象退出作用域时自动调用析构函数。但堆对象作用域是整个程序生命期,所以除非程序运行完成,不然堆对象作用域不会到期。堆对象析构是在释放堆对象语句delete执行之时。4.3分配堆对象假如结构函数有参数,则new后面类类型也需要对应参数。classTDate{public:TDate(inty,intm,intd){ year=y; month=m; day=d;private:intyear,month,day;};voidfn(){ Tdate*pD; pD=newTdate(,1,1);
//… deletepD;}new依据参数匹配标准来调用结构函数,假如写成pD=newTdate;则因为TDate类没有提供无参结构函数而犯错。4.3分配堆对象从堆中还能够分配对象数组classStudent{public:Student(char*pName=“noname”){ strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]=‘\0’;}private:charname[40];};voidfn(intnum){ Student*pS=newStudent[num]; //… delete[]pS;}结构函数被调用num次,依次结构pS[0]到pS[num-1]。从堆上分配对象数组,只能调用默认结构函数,不能调用任何其它结构函数。4.4拷贝结构函数假如希望生成一个对象副本,能够创建一个新对象,并将现有对象数据组员值赋值给新对象对应组员。这种方法可行,但繁琐。更加好路径是使类含有某种复制本类对象能力,这便是拷贝结构函数(CopyConstructor)功效。拷贝结构函数是一个特殊结构函数,含有普通结构函数特点,其作用是用一个已经存在对象去初始化一个新同类对象。4.4拷贝结构函数能够依据实际问题需要定义拷贝结构函数,以实现同类对象之间数据组员传递。假如没有自定义类拷贝结构函数,系统会自动生成一个默认拷贝结构函数,其工作方式是按组员初始化(memberwiseinitialization),即经过依次拷贝每个非静态数据组员实现,假如组员是类对象,则调用其拷贝结构函数或者默认拷贝结构函数。拷贝结构函数形式:类名(类名&对象名)形参是本类对象引用4.4拷贝结构函数classTPoint{public: TPoint(intx=0,inty=0){X=x;Y=y;} TPoint(TPoint&p);//拷贝结构函数
intGetX(){returnX;} intGetY(){returnY;}private: intX,Y;};TPoint::TPoint(TPoint&p){ X=p.X; Y=p.Y; cout<<“拷贝结构函数被调用”<<endl;}4.4拷贝结构函数
普通结构函数在对象创建时被调用,拷贝结构函数在以下三种情况下会被调用:1.用类一个对象去初始化该类另外一个对象,比如:voidmain(){TPointA(1,2);TPointB(A);//用对象A初始化对象B,拷贝结构函数被调用
//…}2.函数形参是类对象,调用函数进行形参和实参结合时,比如voidf(TPointp)//形参p用实参值进行结构{cout<<p.GetX()<<endl;}4.4拷贝结构函数3.函数返回值是类对象,函数执行完成返回调用者时,拷贝结构函数会被调用。TPointg(){TPointA(1,2);returnA;}voidmain(){TPointB;B=g();}说明:函数g表面上将对象A返回给主函数,但A是局部对象,离开建立它函数后就消亡了,不可能在返回主函数后继续生存,编译系统在处理这种情况时会在主函数中创建一个暂时无名对象,该暂时对象生存期只在函数调用所处表示式中。执行“returnA;”时,实际上是调用拷贝结构函数将对象A复制到暂时对象中。表示式B=g();计算完成后,暂时对象自动消失。4.4拷贝结构函数
普通要求,创建暂时对象,只在创建它们外部表示式中有效。Studentfn(){ Studentms(“Randy”); returnms;}voidmain(){ Student&ref=fn(); //….}
因为外部表示式Student&ref=fn();到分号处结束,之后从fn()返回暂时对象不再有效,即ref所引用目标不复存在。4.5深拷贝和浅拷贝
在默认拷贝结构函数中,拷贝方式是逐一组员依次复制。但一个对象可能会拥有一些资源,当结构函数为其分配了一个资源(比如堆内存)时候,假如拷贝结构函数简单地制作了一个指向该资源副本,而不是重新分配,就会出现两个对象拥有同一个资源,当对象析构时,资源会被返还两次。这种复制对象组员,但不复制资源方式称为浅拷贝。4.5深拷贝和浅拷贝假如创建一个对象时,分配了资源就需要定义自己拷贝结构函数来改变缺省逐组员拷贝方式,不但拷贝组员,也拷贝资源,这种方式称为深拷贝。通常,假如类需要析构函数来释放资源话,那么它也需要一个拷贝结构函数。4.6无名对象
能够直接调用结构函数产生无名对象。voidfn(){ Student(“Randy”); //….}
无名对象能够作为实参传递给函数,能够用来拷贝结构一个新对象,也能够初始化一个引用。voidfn(Student&s);voidmain(){ Student&refs=Student(“Randy”); Students=Student(“Randy”); fn(Student(“Randy”));}4.7结构函数用于类型转换
转换用户自定义类类型需要定义含有一个参数结构函数。classStudent(){ public: Student(char*); //….};
因为有Student(char*)结构函数,又有函数fn(Student&s),于是fn(“Jenny”)被认为是fn(Student(“Jenny”)),给予匹配。voidfn(Student&s);voidmain(){ fn(“Jenny”);}4.7结构函数用于类型转换
结构函数用于类型转换时要注意以下两点:只会尝试含有一个参数结构函数假如存在二义性,则放弃尝试classStudent(){public:Student(char*pName=“noname”);//….};classTeacher(){pub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《有丝分裂原理与实例解析》课件
- 计算机硬件行业可持续发展研究考核试卷
- 2025年碳酸乙烯酯项目建议书
- 2025年税务大数据项目合作计划书
- 茶叶栽培的茶叶加工技术与产品创新考核试卷
- 石墨及碳素制品批发考核试卷
- 三年级数学解题策略复习课件
- 九寨沟课件语文A版
- 2025年一级建造师之一建港口与航道工程实务每日一练试卷B卷含答案
- 《英语语法概览》课件 - 深入理解英语语法基础
- 城市沿街建筑立面改造工程施工组织设计
- 三年级下册美术教案- 第16课 生活与艺术中的花 ▏人美版
- 自愿参加活动免责申明
- 护理研究中的偏倚及控制课件
- 提高门诊患者满意度品管圈
- 2023年下半年软件设计师上午真题试卷
- 2024年同等学力申硕-同等学力(哲学)笔试参考题库含答案
- 防范帮信罪知识讲座
- 建筑设计防火要求规范2024修订版
- 2021年武汉中考数学试题(附答案)
- 2024-2024学年湖北省武汉市洪山区八年级(下)期末数学试卷
评论
0/150
提交评论