- 1、本文档共18页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
面向对象程序设计(C++) 第4章堆与拷贝构造函数 4.1 关于堆 C++程序的内存格局通常分为四个区: 全局数据区 代码区 栈区 堆区 全局变量、静态数据、常量存放在全局数据区;所有类的成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放于栈区;余下的空间作为堆区。 4.2 需要new和delete的原因 从C++的立场来看,不使用malloc()函数的原因是它在分配空间的时候不能调用构造函数。类对象的建立包括分配空间、构造结构以及初始化,这些是由构造函数统一完成的。 void fn() { Tdate * pD; pD=(Tdate *) malloc(sizeof(TDate)); //… free(pD); } class TDate { public: TDate(); //构造函数 void SetDate(int y, int m, int d); int IsLeapYear(); void Print(); private: int year, month, day; }; 4.2 需要new和delete的原因 如果构造函数被调用,则须在进行内存分配的malloc()调用时进行,而malloc()仅是一个函数调用,没有足够的信息调用构造函数。pD从malloc()获得只是一个含有随机数据的类对象空间,须在内存分配之后再进行初始化。 void fn() { Tdate * pD; pD=(Tdate *) malloc(sizeof(TDate)); pD-SetDate(2011,1,1); //… free(pD); } 4.3 分配堆对象 C++的new和delete机制更简单易懂。 void fn() { Tdate * pS; pS=new TDate; //分配堆空间并构造 //… delete pS; //析构并将空间返还给堆 } 如果分配局部对象,则在该局部对象退出作用域时自动调用析构函数。但堆对象的作用域是整个程序生命期,所以除非程序运行完毕,否则堆对象的作用域不会到期。堆对象的析构是在释放堆对象语句delete执行之时。 4.3 分配堆对象 如果构造函数参数,则new后面的类类型也需要相应的参数。 class TDate { public: TDate(int y, int m, int d) { year=y; month=m; day=d; private: int year, month, day; }; void fn() { Tdate * pD; pD=new Tdate(2011,1,1); //… delete pD; } new根据参数匹配的原则来调用构造函数,如果写成pD=new Tdate;则由于TDate类没有提供无参的构造函数而出错。 4.3 分配堆对象 从堆中还可以分配对象数组 class Student { public: Student(char * pName=“no name”) { strncpy(name,pName,sizeof(name)); name[sizeof(name)-1]=‘\0’; } private: char name[40]; }; void fn(int num) { Student *pS=new Student[num]; //… delete []pS; } 构造函数被调用num次,依次构造pS[0]到pS[num-1]。 从堆上分配对象数组,只能调用默认构造函数,不能调用任何其他构造函数。 4.4 拷贝构造函数 如果希望生成一个对象的副本,可以创建一个新的对象,并将现有对象的数据成员值赋值给新对象的相应成员。这种方法只在一定条件下可行,但繁琐。更好的途径是使类具有某种复制本类对象的能力,这便是拷贝构造函数(Copy Constructor)的功能。 拷贝构造函数是一种特殊的构造函数,具有一般构造函数的特点,其作用是用一个已经存在的对象去初始化一个新的同类对象。 4.4 拷贝构造函数 可以根据实际问题的需要定义拷贝构造函数,以实现同类对象之间数据成员的传递。如果没有自定义类的拷贝构造函数,系统会自动生成一个默认的拷贝构造函数,其工作方式是按成员初始化(memberwise initialization),即通过依次拷贝每个非静态数据成员实现,如果成员是类对象,则调用其拷贝构造函数或者默认拷贝构造函数。 拷贝构造函数的形式:类名(类名 对象名) 形参是本类对象的引用 4.4 拷贝构造函数 class TPoint { public: TPoint (int x=0,int y=0){
您可能关注的文档
最近下载
- 八年级物理上册《透镜》练习题(含答案解析) .pdf
- 插花与花艺设计(花道——插花技艺养成)智慧树知到期末考试答案章节答案2024年云南林业职业技术学院.docx
- 四书精读教学-《四书》精读课堂笔记.docx VIP
- 2022年青岛版五四制三年级上册数学典型应用题105道.pdf
- 国旗下讲话:远离垃圾食品,享受健康生活.doc
- 幼儿园课件:第八章--学前儿童的情绪和情感.pptx
- 部编版语文九年级下册课内外古诗词(共17首)阅读理解题背诵-中考考点汇总(全册-含答案).doc VIP
- 第一章立体构成概述 .ppt
- 2024年河北省继续医学教育公共选修课参考答案.pdf VIP
- 《立体构成》课件 第一章 立体构成概述.ppt
文档评论(0)