您所在位置: 网站首页 / 拷贝构造函数剖析.docx / 文档详情
拷贝构造函数剖析.docx 立即下载
2025-08-27
约7.8千字
约15页
0
17KB
举报 版权申诉
预览加载中,请您耐心等待几秒...

拷贝构造函数剖析.docx

拷贝构造函数剖析.docx

预览

免费试读已结束,剩余 10 页请下载文档后查看

10 金币

下载文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

拷贝构造函数剖析

第一篇:拷贝构造函数剖析拷贝构造函数剖析在讲课过程中,我发现大部分学生对拷贝构造函数的理解不够深入,不明白自定义拷贝构造函数的必要性。因此,我将这部分内容,进行了总结。拷贝构造函数是一种特殊的构造函数,其形参为本类的对象引用。功能:使用一个已经存在的对象始初化同类的一个新对象。这样得到对象和原来的对象具有完全相同的数据成员,即相同的属性。拷贝构造函数的函数原型:A(constA&other){……}拷贝构造函数的应用场合:当用类的一个对象去初始化该类的另一个对象时;若函数的形参为类对象,调用函数时,实参赋值给形参;当函数的返回值是类对象时。比如:Aa1(10);Aa2=a1;Aa3(a1);//构造函数//拷贝构造函数//拷贝构造函数默认拷贝构造函数:成员变量之间的“值”拷贝编写拷贝构造函数的必要性classA{public:A(constchar*data){name=newchar[strlen(data)+1];strcpy(name,data);}A(constA&other){name=newchar[strlen(other.name)+1];strcpy(name,other.name);}private:char*name;};考察:char*data=“abcd”;Aa1(data);Aa2=a1;如果未定义拷贝构造函数,会有何种后果?现将a1赋给a2,缺省拷贝构造函数的“位拷贝”意味着执行a2.name=a1.name。这将造成二个错误:一是a2.name和a1.name指向同一块内存,任何一方变动都会影响另一方;二是在对象被析构时,name被释放了两次。第二篇:拷贝构造函数和赋值函数的区别拷贝构造函数和赋值函数的区别一个类会默认生成它的string()//默认普通构造函数voidstring(conststring&a)//默认拷贝构造函数,如果自己不实现,会用这个默认的//采用“位拷贝”的方式,对有成员指针的情况,一定有//问题,因为“位拷贝”,指向同一地址空间,自己//实现,改成“值拷贝”~stirng()//默认析构函数conststring&operation=(conststring&a)//默认赋值函数,如果自己不实现,//默认的也是采用“位拷贝”的方式“位拷贝”,stringa(b);除了a,b对象的地址不一样,但a,b成员对象都指向的同一地址空间。如果deletea,就会删掉b的内容,所以位拷贝,对有指针成员变量的类,非常危险拷贝构造函数发生的例子:Aa(1);//调用构造函数,Ab(a);//调用拷贝构造函数Ac=a;//第一次赋值,因为对象还没初始化,还是调用拷贝构造函数,c=b;//已经初始化的对象才能调用赋值函数voidf(Aa);//函数声明f(c);//实参传递时调用拷贝构造函数,但是编译器会根据具体情况把这个过程优化掉总结:1.拷贝构造函数只有在定义一个新的类对象并且用已有的对象进行初始化时调用.2.赋值函数只有在已经初始化(对象已定义)的情况下被调用例如有一个类叫做‘myclass',并有一个实例:b那么,myclassa=b;//拷贝构造函数myclassa;a=b;//赋值两者调用的时间不一样,第一种情况下,a此时还没有被分配空间,在扶植的同时还要生成资源;第二种情况下,a一构造完成,已经有了资源,所以此时等号只进行赋值。第三篇:不要轻视拷贝构造函数与赋值函数不要轻视拷贝构造函数与赋值函数由于并非所有的对象都会使用拷贝构造函数和赋值函数,程序员可能对这两个函数有些轻视。请先记住以下的警告,在阅读正文时就会多心:本章开头讲过,如果不主动编写拷贝构造函数和赋值函数,编译器将以“位拷贝”的方式自动生成缺省的函数。倘若类中含有指针变量,那么这两个缺省的函数就隐含了错误。以类String的两个对象a,b为例,假设a.m_data的内容为“hello”,b.m_data的内容为“world”。现将a赋给b,缺省赋值函数的“位拷贝”意味着执行b.m_data=a.m_data。这将造成三个错误:一是b.m_data原有的内存没被释放,造成内存泄露;二是b.m_data和a.m_data指向同一块内存,a或b任何一方变动都会影响另一方;三是在对象被析构时,m_data被释放了两次。拷贝构造函数和赋值函数非常容易混淆,常导致错写错用。拷贝构造函数是在对象被创建时调用的,而赋值函数只能被已经存在了的对象调用。以下程序中,第三个语句和第四个语句很相似,你分得清楚哪个调用了拷贝构造函数,哪个调用了赋值函数吗?Stringa(“hello”);Stringb(“world”);Stringc=a;//调用了拷贝构造函数,最好写成c(a);c=b;//调用了赋值函数本例中第
查看更多
单篇购买
VIP会员(1亿+VIP文档免费下)

扫码即表示接受《下载须知》

拷贝构造函数剖析

文档大小:17KB

限时特价:扫码查看

• 请登录后再进行扫码购买
• 使用微信/支付宝扫码注册及付费下载,详阅 用户协议 隐私政策
• 如已在其他页面进行付款,请刷新当前页面重试
• 付费购买成功后,此文档可永久免费下载
全场最划算
12个月
199.0
¥360.0
限时特惠
3个月
69.9
¥90.0
新人专享
1个月
19.9
¥30.0
24个月
398.0
¥720.0
6个月会员
139.9
¥180.0

6亿VIP文档任选,共次下载特权。

已优惠

微信/支付宝扫码完成支付,可开具发票

VIP尽享专属权益

VIP文档免费下载

赠送VIP文档免费下载次数

阅读免打扰

去除文档详情页间广告

专属身份标识

尊贵的VIP专属身份标识

高级客服

一对一高级客服服务

多端互通

电脑端/手机端权益通用