版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第5章堆与拷贝构造函数
5.1关于堆C++的内存格局通常分为四个区:代码区、全局数据、栈区、堆区。全局变量、静态数据、常量存放在全局数据区,所有类成员函数和非成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回地址等存放在栈区,余下的空间都被作为堆区。
第五章堆与拷贝构造函数5.2需要new和delete的原因
使用new和delete比malloc()和free()简单,不用头文件声明。从程序设计的需要来看,在分配内存申请的时候,总是知道分配的空间派什么用,而且分配空间大小总是某个数据类型(包括类类型)的整数倍。类对象的建立是分配空间、构造结构以及初始化的三位一体,它们统一由构造函数来完成。malloc()函数在分配空间的时候不能调用构造函数。第五章堆与拷贝构造函数5.3分配堆对象如果是分配局部对象,则在该局部对象退出作用域时自动调用析构函数。但是堆对象的生命期是整个程序生命期,所以除非程序运行完毕,否则堆对象生命不会到期。堆对象析构是在释放堆对象语句delete之时。
构造函数可以有参数,所以跟在new的类型后也可以有参数。从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数。voidfn(){TDate*pS;pS=newTDate;……deletepS;}第五章堆与拷贝构造函数#include<iostream.h>classTPoint{public:TPoint(intx,inty){X=x;Y=y;cout<<"ConstructorCalled."<<X<<","<<Y<<"\n";}TPoint(TPoint&p){X=p.X;Y=p.Y;cout<<"CopyconstructorCalled."<<X<<","<<Y<<"\n";}~TPoint(){cout<<"DestructorCalled."<<X<<","<<Y<<"\n";}intXcoord(){returnX;}intYcoord(){returnY;}private:intX,Y;};第五章堆与拷贝构造函数#include<iostream.h>#include“point.h”voidmain(){TPointp1(5,7);TPointp2(p1);cout<<“p2=(“<<p2.Xcoord()<<“,”<<p2.Ycoord()<<“)”<<endl;
}ConstructorCalled.5,7CopyconstructorCalled.5,7p2=(5,7)DestructorCalled.5,7DestructorCalled.5,7第五章堆与拷贝构造函数TPointf(TPointq){cout<<"Infunctionf!\n";intx,y;x=q.Xcoord()+10;y=q.Ycoord()+20;TPointr(x,y);returnr;}voidmain(){TPointm(20,35),p(0,0);TPointn(m);p=f(n);cout<<"Return,inmain().\n";cout<<"p=("<<p.Xcoord()<<","<<p.Ycoord()<<")"<<endl;}ConstructorCalled.20,35ConstructorCalled.0,0CopyconstructorCalled.20,35CopyconstructorCalled.20,35Infunctionf!ConstructorCalled.30,55CopyconstructorCalled.30,55DestructorCalled.30,55DestructorCalled.20,35DestructorCalled.30,55Return,inmain().p=(30,55)DestructorCalled.20,35DestructorCalled.30,55DestructorCalled.20,35classStudent{public:Student(char*pName="noname",intssId=0){strncpy(name,pName,40);name[39]='\0';id=ssId;cout<<"Constructingnewstudent"<<pName<<endl;}Student(Student&s){cout<<"Constructingcopyof"<<<<endl;strcpy(name,"copyof");strcat(name,);id=s.id;}~Student(){cout<<"Destructing"<<name<<endl;}protected:charname[40];intid;};voidfn(Students){cout<<"Infunctionfn()\n";}voidmain(){Studentrandy("Randy",1234);cout<<"Callingfn()\n";fn(randy);cout<<"Returnedfromfn()\n";}第五章堆与拷贝构造函数ConstructingnewstudentRandyCallingfn()ConstructingcopyofRandyInfunctionfn()DestructingcopyofRandyReturnedfromfn()DestructingRandy第五章堆与拷贝构造函数5.5默认拷贝构造函数类定义中,如果未提供自己的拷贝构造函数,则C++提供一个默认拷贝构造函数,就像没有提供构造函数时,C++提供默认构造函数一样。C++提供的默认拷贝构造函数的功能是把初始值对象的每个数据成员的值都复制到新建立的对象中,即完成一个成员一个成员的拷贝。classStudent{public:Student(char*pName="noname"){cout<<"Constructingnewstudent"<<pName<<endl;strncpy(name,pName,sizeof(name));name[sizeof(name)-1]='\0';}Student(Student&s){cout<<"Constructingcopyof"<<<<endl;strcpy(name,"copyof");strcat(name,);}~Student(){cout<<"Destructing"<<name<<endl;}protected:charname[40];};第五章堆与拷贝构造函数classTutor{public:Tutor(Student&s):student(s){cout<<"Constructingtutor\n";}protected:Studentstudent;};voidfn(Tutortutor){cout<<"Infunctionfn()\n";}voidmain(){Studentrandy("Randy");Tutortutor(randy);cout<<"Callingfn()\n";fn(tutor);cout<<"Returnedfromfn()\n";}第五章堆与拷贝构造函数voidfn(Tutortutor){cout<<"Infunctionfn()\n";}voidmain(){Studentrandy("Randy");Tutortutor(randy);cout<<"Callingfn()\n";fn(tutor);cout<<"Returnedfromfn()\n";}第五章堆与拷贝构造函数ConstructingnewstudentRandyConstructingcopyofRandyConstructingtutorCallingfn()ConstructingcopyofcopyofRandyInfunctionfn()DestructingcopyofcopyofRandyReturnedfromfn()DestructingcopyofRandyDestructingRandy第五章堆与拷贝构造函数
5.6深拷贝构造函数、默认拷贝构造函数和赋值都将现存的一个对象的值拷贝到一个新的存储位置,浅拷贝正是这种拷贝,它只拷贝一个对象数据成员的值,但不拷贝资源的分配。浅拷贝也称为逐成员拷贝。深拷贝是在浅拷贝的基础上,重复拷贝被拷贝者引用的资源。凡是需要析构函数深拷贝的时候,也需要深拷贝。S对象T对象资源classPerson{public:Person(char*pN){cout<<"Constructing"<<pN<<endl;pName=newchar[strlen(pN)+1];if(pName!=0)strcpy(pName,pN);}~Person(){cout<<"Destructing"<<pName<<endl;pName[0]='\0';deletepName;}protected:char*pName;};voidmain(){Personp1("Randy");Personp2=p1;//即Personp2(p1);}第五章堆与拷贝构造函数ConstructingRandyDestructingRandyDestructingNullpointerassignment第五章堆与拷贝构造函数
5.7临时对象Studentfn(){//……Studentms(“Randy”);Return(ms);}voidmain(){Students;s=fn();//……}voidmain(){Student&s=fn();//……}很危险!第五章堆与拷贝构造函数5.8无名对象直接调用构造函数可以产生无名对象voidmain(){Student&refs=Student(“Randy”);Students=Student(“Jenny”);fn(Student(“Danny”));//……}第五章堆与拷贝构造函数
5.9类型转换classStudent{public:Student(char*);//……};voidfn(Student&s);voidmain(){fn(“Jenny”);}第五章堆与拷贝构造函数classexample
{public:
intnum;
public:
~example(){cout<<"Destroying"<<num<<endl;};
example(intn){num=n;cout<<"Initialing"<<num<<endl;};
voidprint(){cout<<num<<endl;};
};
voidmain()
{exampleX(0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2030年中国滑动斜切锯行业发展动态与前景趋势预测报告
- 2024年助悬剂项目提案报告
- 2024-2030年中国沙拉汁市场营销模式及发展竞争力研究报告
- 2024-2030年中国汽车电动燃油泵过滤网行业市场运营模式及未来发展动向预测报告
- 2024年光纤用GECL4项目规划申请报告范文
- 2024-2030年中国汽车2S行业供需状况及投资经营模式分析报告
- 2024-2030年中国氢氧化钾(苛性钾)市场供需预测分析及投资可行性研究报告
- 2023年高考全一轮微专题15-逆温(解析版)
- 个人工作检讨书
- 2022年大学预防医学专业大学物理下册期末考试试题C卷-附解析
- 财经素养知识考试题及答案
- 叙事护理学智慧树知到答案2024年中国人民解放军海军军医大学
- 口腔黏膜疾病的诊断和治疗新进展
- 预支款项协议书
- 完整版抖音运营推广方案课件
- 公司以PPP模式实施专项项目可行性专题研究报告可研模板
- 中国邮政社招笔试题库
- 江西省内装修合同范本
- 《湖南省建设工程计价办法》《湖南省建设工程消耗量标准》交底宣贯课件-2020湖南省房屋建筑与装饰工程消耗量标准交底
- 养老机构服务质量评价指标体系的构建
- MOOC 中国电影经典影片鉴赏-北京师范大学 中国大学慕课答案
评论
0/150
提交评论