第5章堆与拷贝构造函数-PPT幻灯片_第1页
第5章堆与拷贝构造函数-PPT幻灯片_第2页
第5章堆与拷贝构造函数-PPT幻灯片_第3页
第5章堆与拷贝构造函数-PPT幻灯片_第4页
第5章堆与拷贝构造函数-PPT幻灯片_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

第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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论