构造析构的调用顺序_第1页
构造析构的调用顺序_第2页
构造析构的调用顺序_第3页
构造析构的调用顺序_第4页
构造析构的调用顺序_第5页
已阅读5页,还剩17页未读, 继续免费阅读

下载本文档

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

文档简介

0/44Review构造析构的调用顺序对象数组—注意只含带参构造函数的情况对象指针、对象数据成员指针、对象成员函数指针、this共用数据的保护常数据成员常对象:都是常数据、不能调用非常成员函数常成员函数1/44Content3.6共用数据的保护常指针常引用3.7对象的动态建立和释放3.8对象的赋值与复制2/44Content3.6共用数据的保护常指针常引用3.7对象的动态建立和释放3.8对象的赋值与复制3/443.6共用数据的保护5、指向对象的常指针什么时候需要常指针让其指向对象?

特点:指向始终不变但指向的内容可变定义一个指向对象的常指针的格式为:

?类名*?指针变量名

=对象地址;

Time*constt=newTime;

t=newTime;6、指向常对象的指针定义指向常对象的指针格式:const类名*指针名;特点:指向可变但指向的内容不可变const

Timeconst*t=newTime;

t=newTime;t->settime(1,2,3);4/443.6共用数据的保护如果一个对象被声明为常对象,只能用指向常对象的指针指向它。如:constTimet1(12,22,32);//常对象

Time*pt=&t1;//如何定义该指针指向常对象的指针如果指向了非const对象如:Timet2(13,23,34);//非常对象

constTime*pt=&t2;pt->hour=11;t2.hour=11;7、指向常对象的常指针

如何写?

constTime*pt=&t1;其指向的对象值不能用指针改变,可以用非指针方式改变。5/443.6共用数据的保护当对象指针做形参时,需注意:形参实参是否合法指针所指变量值能否改变非const对象的指针非const对象的地址合法可以const对象的地址非法/常对象的指针非const对象的地址合法不可以const对象的地址合法不可以6/443.6共用数据的保护指向常对象的指针最常用于函数的形参,目的是保护形参指针所指的对象不被修改。例7/44Content3.6共用数据的保护常指针常引用3.7对象的动态建立和释放3.8对象的赋值与复制8/443.6共用数据的保护对象的常引用 如果不希望在函数中修改参数,可以把引用型形参定义成const型: 函数返回类型函数名(const形参类型

&形参名);

什么时候使用常指针和常引用?想保证数据安全,不被修改;想不必建立实参的拷贝,提高程序效率,节省内存。9/443.6共用数据的保护const数据小结

形式含义Timeconstt1;constTimet1;t1是常对象,其值在任何情况下不能改变voidTime::func()constfunc是Time类中的常成员函数,可以引用,但不能修改本类中的数据成员Time*constp;p是指向Time对象的常指针,p的值,即p的指向不能改变ConstTime*p;p是指向Time类常对象的指针,其指向的对象的值不能通过指针来改变constTime&t1=t;t1是Time类对象t的常引用,函数中不能改变实参值10/44Content3.6共用数据的保护常指针常引用3.7对象的动态建立和释放3.8对象的赋值与复制11/443.7对象的动态建立和释放1、为什么要动态建立和释放对象(前述、实际、语言)2、动态建立对象的方法设存在Box类,则

newBox;即为建立一个动态对象开辟内存空间-运行构造函数-返回指向该对象的地址

Box*pt;pt=newBox;cout<<pt->height<<endl;

说明:new动态创建的对象,一般只能通过指针访问

注意:内存不足,创建失败的情况(返回0)“无名对象”

12/443.7对象的动态建立和释放3、动态撤消对象的方法:

deletept;//只是释放内存并不销毁指针思考:在执行delete运算符时,在释放空间之前,系统会调用什么函数,完成清理工作。注意:动态撤销对象指针数组时,要有[]Box*pt=newBox[3];delete[]pt;13/44Content3.6共用数据的保护常指针常引用3.7对象的动态建立和释放3.8对象的赋值与复制14/443.8对象的赋值与复制在C语言中,可以用已定义的变量初始化同类型变量。如:

inta=5;intb=a;在C++中,也可用已定义的对象初始化同类对象。如:例

TDated1(2,10,1997);TDated2(d1);

也可以写做:

TDated1(2,10,1997);TDated2=d1;用一个对象初始化另一个对象,通常意味着数据成员的逐个复制。复制TDated1(2,10,1997),d3(3,23,2010);Dated2=d1;…..d2=d3;赋值15/443.8对象的赋值与复制根据已有对象构造新的对象C++中提供了拷贝构造函数的机制:特殊的构造函数:带有一个参数,参数为本类的对象且参数采用常引用方式

作用是将实参对象的各个数据成员值一一赋予给新的对象中对应的数据成员。16/443.8对象的赋值与复制

1.拷贝构造函数定义的一般形式//自定义

类名::函数名(类名&对象名){//函数名

//拷贝构造函数的函数体

}classT{

inta;public:

T(){a=0;}

... };T(T&t);//拷贝构造函数T::T(T&t){a=t.a;}1、是构造函数,函数名与类名相同,且无返回值;2、函数只有一个参数,且是同类对象的引用;3、每个类必须有一个拷贝构造,若无显示定义,则系统自动添加。17/443.8对象的赋值与复制执行classTDate{public: TDate(int,int,int);

voidshowDate();private: intyear; intmonth; intday;};TDate(TDate&);TDate::TDate(inty,intm,intd):year(y),month(m),day(d){}TDate::TDate(TDate&td){

}year=td.year;month=td.month;day=td.day;思考:用拷贝构造函数创建出的对象在释放时是否会执行析构函数18/443.8对象的赋值与复制在下列情况下,会自动调用拷贝构造函数:

a)用一个已经存在的对象初始化一个新创建的同类对象。

TDatet1(1,2,3);TDatet2(t1);b)对象作为函数参数,采用传值调用时

voidfunc(TDatet1,TDatet2);func(t1,t2);c)某个函数的返回值是一个对象,也要创建对象副本,此时也需要自动调用拷贝构造函数。例子19/443.8对象的赋值与复制默认拷贝构造函数如果没有为类定义拷贝构造函数,编译程序会自动定义默认拷贝构造函数。默认拷贝构造:语义是(数据)成员逐个依次拷贝。TDate::TDate(TDate&td){year=td.year;month=td.month;day=td.day;}思考:既然默认拷贝构造函数,已经可以实现数据成员的复制,为什么还要自定义呢?20/443.8对象的赋值与复制在某些情况下,默认拷贝构造函数会引发错误。例子例:

若类中有指针成员,且该指针指向了一片动态分配的存储空间classPerson{public:Person(char*);~Person();protected:

char*pName;};Person::Person(char*pn){

pName=newchar[strlen(pn)+1];if(pName!=NULL)

温馨提示

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

评论

0/150

提交评论