对深拷贝与浅拷贝的理解

首先看下:
拷贝构造函数和赋值函数的区别:

例如:一个类叫做:"myclass",并有一个实例b

          那么(1) myclass a=b;  拷贝构造函数

                (2)myclass a;    a=b; 赋值构造函数

两者调用的时间不一样:第一种情况下,a此时还没有被分配空间,在赋值的同时还要生成资源

                                      第二种情况下,a构造完成,已经有了资源,所以此时等号只进行赋值。

其次继续看:

如果函数返回值是一个对象,考虑return语句的效率。例如return String(s1+s2);

这是临时对象的语法,表示“创建一个临时对象并返回它”。不要以为它与“先创建一个局部对象temp并返回它的结果”是等价的,如

String temp(s1 + s2);

return temp;

实质不然,上述代码将发生三件事。首先,temp对象被创建,同时完成初始化;然后拷贝构造函数把temp拷贝到保存返回值的外部存储单元中;最后,temp在函数结束时被销毁(调用析构函数)。然而“创建一个临时对象并返回它”的过程是不同的,编译器直接把临时对象创建并初始化在外部存储单元中,省去了拷贝和析构的化费,提高了效率。

类似地,我们不要将

return int(x + y); // 创建一个临时变量并返回它

写成

int temp = x + y;

return temp;

由于内部数据类型如int,float,double的变量不存在构造函数与析构函数,虽然该“临时变量的语法”不会提高多少效率,但是程序更加简洁易读。

最后来看深拷贝与浅拷贝:

拷贝有2种,深拷贝与浅拷贝。

当出现类的等号赋值的时候,会调用拷贝函数。

在未定义显示拷贝构造函数情况下,系统会调用默认的拷贝函数——浅拷贝,它能够完成成员的一一复制,当数据成员中没有指针时,浅拷贝是可行的;

但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一地址,当对象块结束时,会调用2次析构函数,从而导致指针悬挂现象,这时必须采用深拷贝。

深拷贝与浅拷贝的区别在于:深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂问题。

总之一句话:深拷贝意味者拷贝了资源和指针,而浅拷贝只拷贝了指针,没有拷贝资源,这样使得两个指针同指向一个资源,造成同一份资源析构2次,程序崩溃。

上面为个人总结,有错误的地方望大家给我纠正。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值