堆与拷贝构造函数学习教案_第1页
堆与拷贝构造函数学习教案_第2页
堆与拷贝构造函数学习教案_第3页
堆与拷贝构造函数学习教案_第4页
堆与拷贝构造函数学习教案_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、会计学1堆与拷贝构造函数堆与拷贝构造函数第一页,编辑于星期一:十点 三十四分。第1页/共19页第二页,编辑于星期一:十点 三十四分。C+C+程序的内存格局通常分为四个区:程序的内存格局通常分为四个区:1.1.全局数据区全局数据区2.2.代码区代码区3.3.栈区栈区4.4.堆区堆区全局变量、静态数据、常量存放在全局数据区;所有类的全局变量、静态数据、常量存放在全局数据区;所有类的成员函数和非成员函数代码存放在代码区;为运行函数而分配的成员函数和非成员函数代码存放在代码区;为运行函数而分配的局部变量、函数参数、返回数据、返回地址等存放于栈区;余下局部变量、函数参数、返回数据、返回地址等存放于栈区;

2、余下的空间作为堆区。的空间作为堆区。第2页/共19页第三页,编辑于星期一:十点 三十四分。void fn()Tdate * pD;pD=(Tdate *) malloc(sizeof(TDate);/free(pD); class TDatepublic:TDate(); /构造函数构造函数void SetDate(int y, int m, int d);int IsLeapYear();void Print();private:int year, month, day;第3页/共19页第四页,编辑于星期一:十点 三十四分。n如果构造函数被调用,则须在进行内存分配的malloc()调用时进行

3、,而malloc()仅是一个函数调用,没有足够的信息调用构造函数。pD从malloc()获得只是一个含有随机数据的类对象空间,须在内存分配之后再进行初始化。void fn()Tdate * pD;pD=(Tdate *) malloc(sizeof(TDate);pD-SetDate(2011,1,1);/free(pD); 第4页/共19页第五页,编辑于星期一:十点 三十四分。void fn()Tdate * pS;pS=new TDate; /分配堆空间并构造分配堆空间并构造/delete pS; /析构并将空间返还给堆析构并将空间返还给堆 n如果分配局部对象,则在该局部对象退出作用域时自

4、动调用析构函数。但堆如果分配局部对象,则在该局部对象退出作用域时自动调用析构函数。但堆对象的作用域是整个程序生命期,所以除非程序运行完毕,否则堆对象的作对象的作用域是整个程序生命期,所以除非程序运行完毕,否则堆对象的作用域不会到期。堆对象的析构是在释放堆对象语句用域不会到期。堆对象的析构是在释放堆对象语句delete执行之时。执行之时。第5页/共19页第六页,编辑于星期一:十点 三十四分。class TDatepublic:TDate(int y, int m, int d)year=y; month=m;day=d;private:int year, month, day;void fn()

5、Tdate * pD;pD=new Tdate(2011,1,1); /delete pD; nnew根据参数匹配的原则来调用构造函数,如果写成根据参数匹配的原则来调用构造函数,如果写成pD=new Tdate;则由则由于于TDate类没有提供无参的构造函数而出错。类没有提供无参的构造函数而出错。第6页/共19页第七页,编辑于星期一:十点 三十四分。class Studentpublic:Student(char * pName=“no name”)strncpy(name,pName,sizeof(name); namesizeof(name)-1=0;private:char name40

6、;void fn(int num)Student *pS=new Studentnum;/delete pS; n构造函数被调用构造函数被调用num次,依次构造次,依次构造pS0到到pSnum-1。n从堆上分配对象数组,只能调用默认构造函数,不能调用任何其他构造函从堆上分配对象数组,只能调用默认构造函数,不能调用任何其他构造函数。数。第7页/共19页第八页,编辑于星期一:十点 三十四分。第8页/共19页第九页,编辑于星期一:十点 三十四分。形参是本形参是本类对象的类对象的引用引用第9页/共19页第十页,编辑于星期一:十点 三十四分。第10页/共19页第十一页,编辑于星期一:十点 三十四分。第1

7、1页/共19页第十二页,编辑于星期一:十点 三十四分。说明说明:函数:函数g表面上将对象表面上将对象A返回给主函返回给主函数,但数,但A是局部对象,离开建立它的是局部对象,离开建立它的函数后就消亡了,不可能在返回主函数后就消亡了,不可能在返回主函数后继续生存,编译系统在处理函数后继续生存,编译系统在处理这种情况时会在主函数中创建一个这种情况时会在主函数中创建一个临时的无名对象,该临时对象的生临时的无名对象,该临时对象的生存期只在函数调用所处的表达式中存期只在函数调用所处的表达式中。执行。执行“return A;”时,实际上是调用拷时,实际上是调用拷贝构造函数将对象贝构造函数将对象A复制到临时对

8、象中。表复制到临时对象中。表达式达式 B=g( );计算完毕后,临时对象自动消计算完毕后,临时对象自动消失。失。第12页/共19页第十三页,编辑于星期一:十点 三十四分。Student fn()Student ms(“Randy”);return ms;void main()Student &ref=fn();/. n 因为外部表达式因为外部表达式Student &ref=fn(); 到分号处结束,之后从到分号处结束,之后从fn()返回的临时对返回的临时对象不再有效,即象不再有效,即ref所引用的目标不复存在。所引用的目标不复存在。第13页/共19页第十四页,编辑于星期一:十点

9、 三十四分。第14页/共19页第十五页,编辑于星期一:十点 三十四分。第15页/共19页第十六页,编辑于星期一:十点 三十四分。void fn()Student(“Randy”); /.n 无名对象可以作为实参传递给函数,可以用来拷贝构造一个新对象,也可以初始无名对象可以作为实参传递给函数,可以用来拷贝构造一个新对象,也可以初始化一个引用。化一个引用。void fn(Student & s);void main()Student &refs= Student(“Randy”);Student s= Student(“Randy”);fn(Student(“Randy”);第16

10、页/共19页第十七页,编辑于星期一:十点 三十四分。class Student()public:Student(char *);/.;n 因为有因为有Student(char *)的构造函数,又有函数的构造函数,又有函数fn(Student & s),于是,于是fn(“Jenny”)被被认为是认为是fn(Student(“Jenny”) ,予以匹配。,予以匹配。void fn(Student & s);void main()fn(“Jenny”);第17页/共19页第十八页,编辑于星期一:十点 三十四分。n 构造函数用于类型转换时要注意以下两点:构造函数用于类型转换时要注意以下两点:1.只会尝试含有一个参数的构造函数只会尝试含有一个参数的构造函数2.如果存在二义性,则放弃尝试如果存在二义性,则放弃尝试class Student()public:Student(char *pName=“no name”);/.;class Teacher()public:Teacher(char *pName=“no name”);/.;void addCourse(Student

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论