欢迎来到天天文库
浏览记录
ID:63035807
大小:52.93 KB
页数:11页
时间:2021-08-05
《拷贝构造函数.docx》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、拷贝构造函数一.什么是拷贝构造函数首先对于普通类型的对象来说,它们之间的复制是很简单的,例如:inta=100;mtb=a;而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝的简单例子。#iiicludeusingnamespacestd;classCExample{private:hita;public:〃构造函数CExaniple(iiitb){a=b;}〃一般函数voidShow()(cout«a«endl;}};mtmam()(CExanipleA(100);CExampleB=A;〃注意这里的对象初始化要调用
2、拷贝构造函数,而非赋值B.Show();return0;}运行程序,屏幕输出100。从以上代码的运行结果可以看出,系统为对象B分配了内存并完成了与对象A的复制过程。就类对象而言,相同类型的类对象是通过拷贝构造函数来完成整个复制过程的。下面举例说明拷贝构造函数的工作过程。#iiicludeusingnamespacestd;classCExample{private:mta;public:〃构造函数CExaniple(mtb){a=b;}〃拷贝构造函数CExaniple(constCExainple&C)(a=C.a;)〃一般函数voidShow()cout«
3、a«endl;);mtmam()CExanipleA(100);CExanipleB=A;〃CExampleB(A);也是一样的B.Show();return0;)CExample(constCExample&C)就是我们自定义的拷贝构造函数。可见,拷贝构造函数是一种特殊的构造函数,函数的名称必须和类名称一致,它必须的一个参数是本类型的一个引用变量。二.拷贝构造函数的调用时机在C++中,下面三种对象需要调用拷贝构造函数!1.对象以值传递的方式传入函数参数classCExample(private:mta;public:〃构造函数CExample(mtb)a=b;cout«ncre
4、at:H«a«endl;)〃拷贝构造CExample(constCExample&C){a=C.a;cout«ncopyH<5、调用拷贝构造函数把test的值给C。整个这两个步骤有点像:CExampleC(test);(3).等g_Fun()执行完后,析构掉C对象。2.对象以值传递的方式从函数返classCExampleprivate:mta;public:〃构造函数CExample(iiitb)(a=b;)〃拷贝构造CExample(constCExample&C)(a=C.a;cout«HcopyH«endl;)voidShow(J(cout«a«endl;)};〃全局函数CExampleg__Fun()(CExampletemp(O);returntemp:}hitmam()(g-Fun();ret6、urn0;}当g_Fun()函数执行到return时,会产生以下几个重要步骤:(1).先会产生一个临时变量,就叫XXXX吧。(2).然后调用拷贝构造函数把temp的值给XXXXo整个这两个步骤有点像:CExampleXXXX(temp);(3).在函数执行到最后先析构temp局部变量。(4).等g_Fun()执行完后再析构掉XXXX对象。3.对象需要通过另外一个对象进行初始化CExampleA(100);CExampleB=A;//CExampleB(A);后两句都会调用拷贝构造函数。三.浅拷贝和深拷贝1.默认拷贝构造函数很多时候在我们都不知道拷贝构造函数的情况下,传递对象给函数7、参数或者函数返回对象都能很好的进行,这是因为编译器会给我们自动产生一个拷贝构造函数,这就是“默认拷贝构造函数”,这个构造函数很简单,仅仅使用“老对象”的数据成员的值对“新对象”的数据成员一一进行赋值,它一般具有以下形式:Rect::Rect(constRect&r)(width=r.widtli;height=r.height;}当然,以上代码不用我们编写,编译器会为我们自动生成。但是如果认为这样就可以解决对象的复制问题,那就错了,让我们来考虑以下一段代码:classRect(p
5、调用拷贝构造函数把test的值给C。整个这两个步骤有点像:CExampleC(test);(3).等g_Fun()执行完后,析构掉C对象。2.对象以值传递的方式从函数返classCExampleprivate:mta;public:〃构造函数CExample(iiitb)(a=b;)〃拷贝构造CExample(constCExample&C)(a=C.a;cout«HcopyH«endl;)voidShow(J(cout«a«endl;)};〃全局函数CExampleg__Fun()(CExampletemp(O);returntemp:}hitmam()(g-Fun();ret
6、urn0;}当g_Fun()函数执行到return时,会产生以下几个重要步骤:(1).先会产生一个临时变量,就叫XXXX吧。(2).然后调用拷贝构造函数把temp的值给XXXXo整个这两个步骤有点像:CExampleXXXX(temp);(3).在函数执行到最后先析构temp局部变量。(4).等g_Fun()执行完后再析构掉XXXX对象。3.对象需要通过另外一个对象进行初始化CExampleA(100);CExampleB=A;//CExampleB(A);后两句都会调用拷贝构造函数。三.浅拷贝和深拷贝1.默认拷贝构造函数很多时候在我们都不知道拷贝构造函数的情况下,传递对象给函数
7、参数或者函数返回对象都能很好的进行,这是因为编译器会给我们自动产生一个拷贝构造函数,这就是“默认拷贝构造函数”,这个构造函数很简单,仅仅使用“老对象”的数据成员的值对“新对象”的数据成员一一进行赋值,它一般具有以下形式:Rect::Rect(constRect&r)(width=r.widtli;height=r.height;}当然,以上代码不用我们编写,编译器会为我们自动生成。但是如果认为这样就可以解决对象的复制问题,那就错了,让我们来考虑以下一段代码:classRect(p
此文档下载收益归作者所有