

下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第6讲拷贝构造函数1、拷贝(复制)构造函数也叫复制初始化构造函数,是C+中引入的一种新的构造函数,函数的名称与类的名称相同,并且它只有一个参数,该参数就是对该类对象的引用。2、拷贝构造函数的功能是用于实现对象值的复制,通过将一个同类对象 的值复制给一个新对象,来完成对新对象的初始化,即用一个对象去构造另外一个对象。基本概念(P109)3.复制构造函数的调用(P110)声明并初始化变量时对象作为函数参数时 对象作为函数值被返回时、4.说明:如果类中没有定义复制构造函数,则 系统自动生成缺省复制构造函数;在定文了构造函数 后,系统将不会再生成缺省复制构造函数。二、对象之间的赋值(补充)IC+允许在
2、对象之间的进行赋值,语句格式 对象二对象2对象之间的赋值语句不执行构造函数, 因为它不 创建对象。请看下面的程序:#include class TDate private :int year, month, day;public :TDate() cout调用无参的构造函数rT ; TDate(int y, int m, int d) year=y; month=m; day=d;coutVV调用带参的构造函数n” ; voidPrint () cout year 7M monthf7,f day endl; ;void main()TDate d1 (2004,10,8);调用带参的构造函数
3、d1.Print();TDate d2;调用无参的构造函数d2=d1;/将对象d1赋值给d2,不调用构造函数d2.Print();请写出上面程序的执行结果三、复制构造函数的定义(P109)类名(const类名&形式参数)函数体例如:TDate(const Tdate &dd) year=dd.year;month=dd.month ;day=dd.day ;coutvv调用复制初始化构造函数n”如何理解复制构造函数的参数一定是一个该类对象的引用?、应用1:声明对象时#include class TDate private : int year, month, day;publi
4、c :TDate( ) cout vv”调用无参的构造函数TDate(int y, int m, int d) year=y; month=m; day=d;IBcout vv”调用带参的构造函数n” ;TDate(const TDate &dd)year=dd.year ; month=dd.month ; day=dd.day ;cout vv”调用复制初始化构造函数n” ; void Print () cout year 7 month 7M day endl; ;void main()TDate d1 (2004,10,8); 调用带参的构造函!d1.Print();TDate
5、 d2; 调用无参的构造函数d2.Print();TDate d3=d1; 调用复制初始化构造函数d3.Pri nt();1特别注意:1 1TDate d3=d1 ;也可写成 TDate d3(d1);2 2语句 TDate d2; d2=d1;和 TDate d3=d1;的区别d2=d1;将五、应用2:、对象作函数参数时#include iostream.h class TDate private :int year, month, day;public:int yy() return year; int mm() return month; int dd() return day; TDa
6、te(int y, int m, int d) year=y; month=m;day=d;cout vv”调用带参的构造函数n” ; TDate(constTDate &dd) cout调用复制初始化构造函数n” ;;void print(TDate dd) cout dd.yy()*7dd.mm(),7Mdd.dd() endl;void main() TDate d1 (2004,10,8);调用带参的构造函数print(dl);调用复制初始化构造函数思考下面的问题:1、 print 函数中使用 dd.yy()而不使用 dd.year 的原因。2、 如果将 print 函数的原型
7、定义为 void print(TDate &dd),程序的执行结果?还会调用复制初始化构造函数吗?为什么?六、应用3:、对象作函数返回值#include class TDate private :int year, month, day; public :int yy() return year; int mm() return month; int dd() return day; TDate() TDate(int y, int m, int d) year=y; month=m; day=d; cout vv”调用带参的构造函数rT ; year=dd.year;month=dd
8、.month;day=dd.day ; coutvv“调用复制初始化构造函数; void print() cout yearM/Mmonthf7ffdayendl; ;TDate tomorrow(TDate datel)/函数的返回值类型为 TDate 实参形参时,自动调用复制初始化构造函数int y,m,d;y=date1 .yy(); m=date1d=date1 .dd()+1;TDate date2(y,m,d);调用带参的构造函数来创建新的对象 date2 return date2;返回值为对象 date2,自动调用复制初始化构造函数 void main()TDate d1 (20
9、04,10,8); 调用带参的构造函数d1.print();TDate d2;d2=tomorrow(d1);Vd2.print();I分析上面程序的执行结果TDate(co七、缺省的复制构造函数(浅拷贝)如果类中没有定义复制构造函数,则系统自动生 成缺省复制构造函数;缺省复制构造函数的复制策略: 一个成员一个成员的复制。参考程序如下:#include class TDate private:int year, month, day; public :TDate(int y, int m, int d) year=y; month=m; day=d; void print() cout yea
10、r,7Mmonthf7Mdayendl; void main()TDate d1 (2004,10,8);dl.pri nt();TDate d2=d1;调用缺省复制构造函数将d1的各个成员复制给d2d2.print();与d1.print();的结果一样注意:当一个类中含有指针成员时,调用缺省复 制构造函数时只复制指针变量的值(因此叫浅拷贝), 井未将指针变量所指的对象复制出来,导致了调用析 构函数时出现错误。参考下面的程序:#inelude #include class person private:char Fame;public:person( char *s) 带参数构造函姒 nam
11、e=newchar20;strcpy(name,s); void print() coutname endl;-person() delete name;cout VV调用析构函数Mendl; ;void main()person p2=p1;调用缺省的复制初始化函数pl.print(); p2.print(); 程序在执行时出现错误的原因:主函数创建对象p2时调用缺省的复制初始化函数,将对象p1的指针成员name赋给p2的成员name,即=并没有给对象p2的name成员申请空间,p1 .name和p2 narne指向同一段存贮空间。对象p1在调用析构函数时执行de
12、lete将所指空间释放后,对象p2在调用析构函数时再释放空间时导致运行出现错误。解决的办法是使用深拷贝:person在person类的定义中,可以增加如下的复制初 始化函数(深拷贝):person(const person &pp)name=new char20J;申请空间strcpy(name,);/ 赋值main函数创建对象p2时调用上面的复制初始化函数,给对象p2的name成员申请了空间,再将对象p1的指针成员name所指内容赋给p2的成员name,和指向不同的存贮空间。这样就不会出现前面的问题了。写出下面程序的执行结果#i
13、nelude class A private :int x; public :A() x=0; coutM无参的构造函数Mendl; A(int x1) x=x1; cout带参的构造函数Mendl; A(const A&p) x=p.x; cout*复制构造函数Mendl; ; void main() A a19a2(3);程序 X 注竜三种构造函的区别A a3(a1), a4=a2;A a5; a5=a1;程序 2:#inelude #inelude class Point private:int x,y; public :Pointf) x=0; y=0;Point(int x1,inty1) x=x1; y=y1 Point(const Point&p) x=p.x; y=p.y; int getx() return x; intgety(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 巴彦淖尔市2024年数学三上期末学业质量监测模拟试题含解析
- 2025届谢家集区数学三年级第一学期期末复习检测试题含解析
- 2025年工程项目管理深度复习试题及答案
- 2025年中级经济师备考计划与试题及答案
- 水利水电工程续建技术试题及答案
- 2025年经济法考试重点知识分类试题及答案
- 小学生理卫生教育
- 幼儿园节日教育课程介绍
- 农业综合开发利用合同协议书
- 食品饮料生产流程及品质管理预案
- 聚焦离子束系统虚拟仿真实验报告
- GB/T 26572-2011电子电气产品中限用物质的限量要求
- GB/T 18601-2001天然花岗石建筑板材
- GB/T 16920-2015玻璃平均线热膨胀系数的测定
- 公共文化服务保障法解读课件
- 第五章-语言规划与语言调查课件
- 2023年海南省财金集团有限公司招聘笔试模拟试题及答案解析
- 托马斯潘恩课件
- 颅脑损伤患者护理查房课件
- 口腔疾病与全身系统性疾病的关系课件
- 年产16万吨焦油焦油车间蒸馏工段工艺初步设计 毕业设计
评论
0/150
提交评论