如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
第14章堆与拷贝构造函数14.1关于堆14.2需要new和delete的原因14.3分配堆对象14.4拷贝构造函数14.5默认拷贝构造函数14.6浅拷贝与深拷贝14.7临时对象14.8无名对象C++程序的内存格局通常分为四个区:全局数据区(dataarea)全局变量静态数据常量代码区(codearea)所有类成员函数非成员函数代码栈区(stackarea)局部变量函数参数返回数据返回地址堆区(即自由存储区)(heaparea)void*malloc(size_t);和voidfree(void*);在头文件malloc.h中声明,而操作符new和delete是C++语言的一部分,无须包含头文件。他们从堆中分配和释放内存块但在具体操作上两者有很大区别。操作内存时,如果分配了内存,就有责任回收它,否则运行的程序将会造成内存泄漏。这与函数中在栈区分配局部变量有本质的不同。对C++来说,管理堆区是一件十分复杂的工作,频繁地分配和释放不同大小的堆空间,将会产生堆内碎块。从C++的立场上看,不能用malloc()函数的一个原因是,它在分配空间的时候不能调用构造函数classTdate{public:Tdate();SetDate(intm=1,intd=1,inty=1998);protected:intmonth;intday;intyear;};Tdate::Tdate(){month=1;day=1;year=1;}voidTdate::SetDate(intm,intd,inty){if(m>0&&m<13)month=m;if(d>0&&d<32)day=d;if(y>0&&y<3000)year=y;}voidfn(){Tdate*pd;//仅仅是个指针,没有产生对象pd=(Tdate*)malloc(sizeofTdate);//并不调用构造函数free(pd);//并不调用析构函数}下面的代码描述用malloc()来进行对象的创建过程:voidfn(){Tdate*pd;pd=(Tdate*)malloc(sizeofTdate);pd->SetDate();//设置Tdate值//…free(pd);}这从根本上说,不是一个类对象的创建,因为它绕过了构造函数。C++的new和delete机制更简单易懂。voidfn(){Tdate*ps;ps=newTdate;//分配堆空间并构造它//…deleteps;//先析构,然后将空间返回给堆}堆对象析构是在释放堆对象语句delete执行之时。上面的堆对象在执行deleteps;语句时,C++自动调用其析构函数。构造函数可以有参数,所以跟在new后面的类类型也可以跟参数。classTdate{public:Tdate(intm,intd,inty);protected:intmonth;intday;intyear;};Tdate::Tdate(intm,intd,inty){if(m>0&&m<13)month=m;If(d>0&&d<32)day=d;If(y>0&&y<3000)year=y;}voidfn(){Tdate*pd;pd=newTdate(1,1,1998);//若写成pd=newTdate;就错了//…delete(pd);}可用一个对象去构造另一个对象,或者说,用另一个对象值初始化一个新构造的对象,例如:Students1(“Jenny”);Students2=s1;//用s1的值去初始化s2对象作为函数参数传递时,也要涉及对象的拷贝,例如:voidfn(studentfs){//…}voidmain(){Studentms;fn(ms);}形参fs是实参ms的一个拷贝。这时候调用构造函数Student(*char)就不合适,新的构造函数的参数应是Student&,也就是:Student(Student&s);#include<iostream.h>#include<string.h>classStudent{public:Student(char*pname=“noname”,intssid=0){id=ssid;Strcpy(name,pname);cout<<“constructingnewstudent”<<pname<<endl;}Student(Student&s)//拷贝构造函数{cout<<“constructingcopyof”<<s.name<<endl;strcpy(name,”copyof”);strcat(name,s.na