C/C++深拷贝与浅拷贝的理解
拷贝构造函数和赋值函数的区别:
例如:一个类叫做:"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次,程序崩溃。
上面为个人总结,有错误的地方望大家给我纠正。
版权所有: 本文系米扑博客原创、转载、摘录,或修订后发表,最后更新于 2016-02-08 03:36:08
侵权处理: 本个人博客,不盈利,若侵犯了您的作品权,请联系博主删除,莫恶意,索钱财,感谢!
转载注明: C/C++深拷贝与浅拷贝的理解 (米扑博客)