c讲义(6)复制构造函数汇总_第1页
c讲义(6)复制构造函数汇总_第2页
免费预览已结束,剩余11页可下载查看

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论