- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第七章堆与拷贝构造函数.ppt
第6章 堆与拷贝构造函数1.关于堆 C++程序的内存格局通常分为四个区:全局数据区,代码区,栈区,堆区。 全局变量、静态数据、常量存放在全局数据区, 所有类成员函数和非成员函数代码存放在代码区, 为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放在栈区, 余下的空间都被作为堆区。 函数“void * malloc(size_t);” 和 “void free(void *);”在头文件malloc.h中声明;操作符new和delete是c++语言的一部分,无须包含头文件。它们都从堆中分配和释放内存块,但在具体操作上两者有很大的区别。 操作堆内存时,如果分配了内存,就必须回收它,否则运行的程序会造成内存泄漏,这与函数中在栈区分配局部变量有本质的不同。 2.需要new和delete的原因 C++中不使用malloc()函数的一个原因是:它在分配空间的时候不能调用构造函数。例如: void fn() { Tdate *pD; //仅仅是个指针,没有产生对象 pD=(Tdate *)malloc(sizeof Tdate); //并不调用构造函数 pD-SetDate(); // … free(pD); //并不调用析构函数 } 从根本上说,不是一个类对象的创建,因为它绕过了构造函数。 3.分配堆对象 C++的new和delete机制更简单易懂,例如: void fn() { Tdate *pS; pS=new Tdate; //分配堆空间并构造它 // … delete pS; //先析构,然后将空间返还给堆 } new操作会自动调用构造函数,堆对象析构是在释放堆对象语句delete执行之时,c++自动调用其析构函数。 构造函数可以有参数,所以跟在new后面的类类型也可以跟参数。 从堆中还可以分配对象数组。 class Student { public: student(char * pName=“no name”) { strncpy(name,pname,sizeof(name)); name[sizeof(name)-1]=“\0”; } protected: char name[40]; }; void fn(int noOfObjects) { Student * pS=new Student[noOfObjects]; //… delete[] pS; } 由于分配数组时,new的格式是类型后面跟[元素个数],不能再跟构造函数参数,所以,从堆上分配对象数组,只能调用默认的构造函数,不能调用其他任何构造函数。如果该类没有默认构造函数,则不能分配对象数组。 一般来说,由于堆空间相对其他内存空间比较空闲,给程序运行带来了较大的自由度。 4.拷贝构造函数 可以用一个对象值初始化一个新构造的对象,例如: Student s1(“Jenny”); Student s2=s1; //用s1的值去初始化s2 对象作为函数参数传递时,也要涉及对象的拷贝,例如: void fn(Student fs) { // … } void main() { Student ms; fn(ms); } 函数fn()的参数传递的方式是传值,调用时,实参ms传递给了形参fs,fs是ms的一个拷贝,即形参fs用ms的值进行构造。 这是,调用构造函数Student(char *)并不合适,新的构造函数的参数应该是Student,即: Student(Student s); 由于对象的类型多种多样,有些对象还申
文档评论(0)