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

下载本文档

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

文档简介

面向对象程序设计(C++)OrientedObjectProgramming(C++)主讲:严冬梅第5章堆与拷贝构造函数第5章堆与拷贝构造函数

5.1关于堆C++的内存格局通常分为四个区:代码区、全局数据、栈区、堆区。全局变量、静态数据、常量存放在全局数据区,所有类成员函数和非成员函数代码存放在代码区,为运行函数而分配的局部变量、函数参数、返回地址等存放在栈区,余下的空间都被作为堆区。

第五章堆与拷贝构造函数5.2需要new和delete的原因

使用new和delete比malloc()和free()简单,不用头文件声明。从程序设计的需要来看,在分配内存申请的时候,总是知道分配的空间派什么用,而且分配空间大小总是某个数据类型(包括类类型)的整数倍。类对象的建立是分配空间、构造结构以及初始化的三位一体,它们统一由构造函数来完成。malloc()函数在分配空间的时候不能调用构造函数。第五章堆与拷贝构造函数5.3分配堆对象如果是分配局部对象,则在该局部对象退出作用域时自动调用析构函数。但是堆对象的生命期是整个程序生命期,所以除非程序运行完毕,否则堆对象生命不会到期。堆对象析构是在释放堆对象语句delete之时。

构造函数可以有参数,所以跟在new的类型后也可以有参数。从堆上分配对象数组,只能调用默认的构造函数,不能调用其它任何构造函数。voidfn(){TDate*pS;pS=newTDate;……deletepS;}第五章堆与拷贝构造函数5.4拷贝构造函数需要性对象初始化

Tdated1(1999,9,9);

Tdated2=d1;函数参数传递

voidfn(Tdated){}

fn(d1);函数的返回值是类对象Tdatefn(){}

Tdated=fn();拷贝构造函数实际上也是构造函数,其功能是用一个已知的对象来初始化一个被创建的同类的对象。第五章堆与拷贝构造函数格式

class类名{public:类名(形参表);构造函数类名(类名&);//拷贝构造函数声明};类名::类名(类名&对象名)//拷贝构造函数定义{函数体}Tdate::Tdate(Tdate&d){}拷贝构造函数是特殊的构造函数,形参是本类对象的引用,其作用是使用一个已经存在的对象去初始化一个新的同类的对象。第五章堆与拷贝构造函数#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;

温馨提示

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

评论

0/150

提交评论